劍指 offer 09. 用兩個棧實現佇列
示例 1:
輸入:
[,[3],,]
輸出:[null,null,3,-1]
示例 2:
輸入:
[,,[5],[2],,]
輸出:[null,-1,null,null,5,2]
思路和演算法
維護兩個棧,第乙個棧支援插入操作,第二個棧支援刪除操作。
根據棧先進後出的特性,我們每次往第乙個棧裡插入元素後,第乙個棧的頂部元素是最後插入的元素,第乙個棧的底部元素是下乙個待刪除的元素。為了維護佇列先進先出的特性,我們引入第二個棧,用第二個棧維護待刪除的元素,在執行刪除操作的時候我們首先看下第二個棧是否為空。如果為空,我們將第乙個棧裡的元素乙個個彈出插入到第二個棧裡,這樣第二個棧裡元素的順序就是待刪除的元素的順序,要執行刪除操作的時候我們直接彈出第二個棧的元素返回即可。
成員變數
維護兩個棧 stack1 和 stack2,其中 stack1 支援插入操作,stack2 支援刪除操作
構造方法
初始化 stack1 和 stack2 為空
插入元素
刪除元素
刪除元素對應方法 deletehead
如果 stack2 為空,則將 stack1 裡的所有元素彈出插入到 stack2 裡。
如果 stack2 仍為空,則返回 -1,否則從 stack2 彈出乙個元素並返回。
c++:
class
cqueue
while
(!stack2.
empty()
)}void
(int value)
intdeletehead()
}if(stack2.
empty()
)else}}
;
複雜度分析時間複雜度:對於插入和刪除操作,時間複雜度均為 o(1)。插入不多說,對於刪除操作,雖然看起來是 o(n) 的時間複雜度,但是仔細考慮下每個元素只會「至多被插入和彈出 stack2 一次」,因此均攤下來每個元素被刪除的時間複雜度仍為 o(1)。
空間複雜度:o(n)。需要使用兩個棧儲存已有的元素。
劍指 Offer 09 用兩個棧實現佇列
劍指 offer 09.用兩個棧實現佇列 示例 1 輸入 3 輸出 null,null,3,1 示例 2 輸入 5 2 輸出 null,1,null,null,5,2 上大二時候就學的老經典了。思路 宣告兩個棧s1,s2。入佇列操作等同於入棧s1。出佇列操作分三種情況 1.兩個棧都為空,意味著隊列為...
劍指offer 09 用兩個棧實現佇列
示例 1 示例 2 這個地方有點繞,需要注意的是 當stack2不為空時,佇列中的元素都在stack2中 stack2中都是待刪除的元素 無論stack1中是否有元素都從2中彈出元素 頻繁的插入和刪除首選linkedlist,通常情況下不推薦使用vector和及其子類stack class cque...
劍指 Offer 09 用兩個棧實現佇列
該題使用兩個棧,乙個用於存資料,乙個用於取資料,而棧的思路是後進先出,佇列的思路是先進先出,所以需要在插入資料時將所有資料放入a棧,如果此時需要取出資料,那麼就將a內的資料都pop到b中去,假如現在我們插入了 1,2,3 到a中,那麼此時呼叫取資料的函式,將會把資料轉存到b中,b中的資料就為 3,2...