帶你深入理解STL之Stack和Queue

2021-08-20 14:18:58 字數 2699 閱讀 1946

好了,複習完前面的知識後,開始介紹今天的兩個容器stack和queue。由於stack和queue都是基於deque來實現的,所以相應的**會比較簡單,也是比較輕鬆易實現的,下面一起去看看吧。

如果把deque比作乙個管道,兩頭都可進可出的話,stack就是乙個桶!只能一頭進一頭出,而且,壓在下面的東西你看不到,你要是想看,只能把上面的東西拿出來再去看。

stack是一種先進後出的資料結構,允許新增元素、移除元素和取得最頂端的元素,除了最頂端,沒有任何其他方法可以訪問stack中的元素,也就是說stack沒有遍歷行為,因此,stack是沒有迭代器的!!!!!

以deque為底層容器來實現stack這種資料結構,簡直不能再簡單,基本的操作函式都已經定義好了,deque可以為它完成所有工作。與其說stack是一種容器,倒不如說它是一種配接器,一種容器介面卡。

下面我們就來看看stack的原始碼,真的沒騙你,超級簡單。

template

<

class

t, class

sequence = deque

// 以deque作為預設底層容器

class

stack

// stack中元素個數

size_type size

()const

// 返回棧頂元素, 注意這裡返回的是引用!!!

reference top

()

const_reference top

()const

// 在棧頂追加新元素

void

push

(const value_type& x)

// 移除棧頂元素, 注意不返回元素的引用,

// 很多初學者隨機用此容器時經常誤認為pop()操作同時會返回棧頂元素的引用

void

pop()

};

// 判斷兩個stack是否相等, 就要測試其內部維護容器是否相等

// x.c == y.c會呼叫容器過載的operator ==

template

<

class

t, class

sequence>

bool

operator==(const

stack

& x, const

stack

& y)

// 比較兩個迭代器的大小,即比較底層容器的大小

template

<

class

t, class

sequence>

bool

operator

<(const stack& x, const stack& y)

你沒有看錯,stack的原始碼就只有上面幾句話,全是呼叫底層容器的介面。下面再來看看它的同胞queue,同樣很簡單。

queue是一種先進先出的資料結構,上面說道,dequeu是個雙向可進可出的管道,stack是乙個桶,queue就是乙個單向的水管,只能一端進,一端出。

queue允許新增元素、移除元素、從最底端插入元素,從最頂端取得元素,但是,從了最底端插入,最頂端取出之外,沒有任何其他方法可以訪問queue裡面的元素,queue和stack一樣,不允許有遍歷行為,因此,queue也沒有迭代器!!!!

queue和stack一樣,也是一種容器介面卡,只需要呼叫底層容器的介面就能實現。下面來看看它的原始碼吧。

template

<

class

t, class

sequence = deque

>

class

queue

size_type size

()const

reference front

()

const_reference front

()const

reference back

()

const_reference back

()const

void

push

(const value_type& x)

void

pop()

};

// 過載==操作符,比較底層容器即可

template

<

class

t, class

sequence>

bool

operator==(const

queue

& x, const

queue

& y)

// 同上

template

<

class

t, class

sequence>

bool

operator

<(const queue& x, const queue& y)

這篇部落格的兩個」容器「比較容易理解,因為底層都已經學過了,只需要呼叫介面即可。最後再囉嗦兩句,stack是乙個先進後出的容器,queue是乙個先進先出的容器,在使用過程中,需要根據你的需求來選擇。我在刷leetcode的時候,碰到遍歷二叉樹的問題,基本上前、中後序遍歷的非遞迴實現中,都會用到stack,而樹的層序遍歷中,會採用queue,具體的做法可以參考我的這片博文,全面剖析樹的各類遍歷方法,相信看完你會對stack和queue的使用有進一步的理解!

參考:

深入理解 STL

由於 rb tree 紅黑樹 是一種平衡二叉搜尋樹,具有較好的自動排序的效果。關聯式容器 set multiset map multimap 都需根據元素的鍵值 key 對所有元素自動排序,所以標準的 stl set map 都是以紅黑樹為底層機制 set 的原始碼如下 template class...

指標從0 1帶你深入理解

好的指標,一定要圍繞業務模式打造 通速的來講,指標就是用來衡量某某事物的值,體系就是很多個衡量事物的值湊成的乙個有相互性,有層次性的值 建立業務量化衡量的標準 減少重複性工作,提高分析效率 可以快速定位問題 當公司新出乙個業務的時候,需要通過資料更加客觀,明確的的了解到業務的發展趨勢,發展是否健康,...

帶你深入理解解構賦值和箭頭函式

箭頭函式 es6 的內建物件擴充套件 string 的擴充套件方法 什麼是解構賦值?es6中允許從陣列中提取值,按照對應位置,對變數賦值,物件也可以實現解構。let a,b,c 1,2,3 console.log a 1 console.log b 2 console.log c 3 如果解構不成功...