劍指 Offer 09 用兩個棧實現佇列

2022-03-29 09:37:38 字數 1344 閱讀 1394

示例 1:

輸入:

[,[3],,]

輸出:[

null,null,3,-1]

示例 2:

輸入:

[,,[5],[2],,]

輸出:[

null,-1,null,null,5,2]

stack1用存資料,stack2用來輔助取資料,取資料時,如果stack1為空,直接返回-1,否則先把所有元素壓入到stack2中,彈出並記錄stack2棧頂元素,把stack2所有元素再壓回到stack1

1

class

cqueue

1011

public

value)

1415

public

intdeletehead() else

24//

彈出並記錄棧頂元素

25int top =stack2.pop();

2627

//把stack2所有元素再壓回到stack1

28while(!stack2.isempty())

31return

top;32}

33}34 }

leetcode執行時間為332ms, 空間為46.7mb, 這個時間太恐怖了

時間複雜度:插入元素的複雜度為o(1), 刪除元素的複雜度為o(2n)

空間複雜度:兩個棧, 所以為o(2n)

兩個棧,乙個用來存,乙個用來取,兩個棧的元素之和等於當前所有元素。stack2不是取元素的輔助棧,而是專門用來取元素,取元素時,先判斷 stack2是否為空,如果為空,把stack1中的所有元素都搬運到stack2,此時stack2的棧頂到棧底的元素排列順序就是將來取元素的順序

1

class

cqueue

1011

public

value)

1415

public

intdeletehead() 20}

21if

(stack2.isempty())else27}

28 }

leetcode執行時間為55ms, 空間為46.5mb, 這個時間已經好多了

時間複雜度:存元素的時間為o(1), 取元素雖然有時需要把stack1 的所有元素都拷貝到 stack2, 但是每個元素只會入棧和出棧 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...