栈和队列的基础知识
C++中stack和queue 是容器么?
STL中棧往往不被歸類為容器,而被歸類為container adapter(容器適配器)。
STL中隊(duì)列也不被歸類為容器,而被歸類為container adapter( 容器適配器)。
我們使用的stack/deque是屬于那個(gè)版本的STL?
SGI STL
我們使用的STL中stack/deque是如何實(shí)現(xiàn)的?
棧是以底層容器完成其所有的工作,對(duì)外提供統(tǒng)一的接口,底層容器是可插拔的(也就是說我們可以控制使用哪種容器來實(shí)現(xiàn)棧的功能)
SGI STL棧的底層結(jié)構(gòu)默認(rèn)是deque。deque是一個(gè)雙向隊(duì)列,只要封住一段,只開通另一端就可以實(shí)現(xiàn)棧的邏輯了。
我們也可以指定vector為棧的底層實(shí)現(xiàn),初始化語句如下:
std::stack<int, std::vector > third; // 使用vector為底層容器的棧
SGI STL中隊(duì)列一樣是以deque為缺省情況下的底部結(jié)構(gòu)。
也可以指定list 為起底層實(shí)現(xiàn),初始化queue的語句如下:
std::queue<int, std::list> third; // 定義以list為底層容器的隊(duì)列
stack 提供迭代器來遍歷stack空間么?
棧提供push 和 pop 等等接口,所有元素必須符合先進(jìn)后出規(guī)則,所以棧不提供走訪功能,也不提供迭代器(iterator)。不像是set 或者map 提供迭代器iterator來遍歷所有元素。
隊(duì)列 先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),同樣不允許有遍歷行為,不提供迭代器,
棧里面的元素在內(nèi)存中是連續(xù)分布的么?
這個(gè)問題有兩個(gè)陷阱:
陷阱1:棧是容器適配器,底層容器使用不同的容器,決定棧內(nèi)數(shù)據(jù)在內(nèi)存中是不是連續(xù)分布。
陷阱2:缺省情況下,默認(rèn)底層容器是deque,那么deque的在內(nèi)存中的數(shù)據(jù)分布是什么樣的呢?答案是:不連續(xù)的。
「遞歸的實(shí)現(xiàn)是棧:每一次遞歸調(diào)用都會(huì)把函數(shù)的局部變量、參數(shù)值和返回地址等壓入調(diào)用棧中」,然后遞歸返回的時(shí)候,從棧頂彈出上一次遞歸的各項(xiàng)參數(shù),所以這就是遞歸為什么可以返回上一層位置的原因。
總結(jié)
- 上一篇: 重复的子字符串
- 下一篇: 删除字符串中的所有相邻重复项