劍指 offer 刷題 09 用兩個棧實現佇列

2021-10-08 01:42:33 字數 1673 閱讀 1929

示例 1:

輸入:

[,[3],,]

輸出:[null,null,3,-1]

示例 2:

輸入:

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

輸出:[null,-1,null,null,5,2]

1 <= values <= 10000
思路:

題目的要求是,用兩個「先進後出」的棧實現乙個「先進先出」佇列,並且只需要考慮插入和刪除操作。

我們先通過乙個例子分析一下佇列的插入和刪除操作。剛開始兩個棧都為空,不妨用 stack1 儲存插入的元素,依次插入三個元素 1、2、3,得到

|3|			| |

|2| | |

|1| | |

stack1 stack2

這麼看,插入操作很簡單,下面我們試著刪除元素。

佇列是從隊頭刪除元素,也就是要刪除元素 1,而 1 位於 stack1 的棧底,這時候就要用到 stack2 作為輔助棧完成刪除。我們把 stack1 的元素逐個從棧頂彈出,並依次壓入 stack2,得到

| |			|1|

| | |2|

| | |3|

stack1 stack2

我們發現,要刪除的元素 1 位於 stack2 的棧頂,將其彈出並返回即可。此時,

| |			

| | |2|

| | |3|

stack1 stack2

如果再要刪除佇列元素,應該刪除的是 stack2 的棧頂元素,彈出 stack2 的棧頂元素即可。

總結一下刪除元素的步驟: 如果 stack2 不為空,stack2 的棧頂元素就是要刪除的元素,彈出棧頂元素即可;如果 stack2 為空,則先將 stack1 中的元素彈出並依次壓入 stack2,再彈出 stack2 的棧頂元素。

接下來,再插入乙個元素 4,還是把它壓入 stack1,得到

|2|

|4| |3|

stack1 stack2

如果再要刪除元素,依然是從 stack2 中彈出元素,因為 stack2 中的元素是比 stack1 中的元素先進入佇列的。

總結一下:用兩個棧實現佇列,其中乙個棧支援插入操作,另乙個棧支援刪除操作。另外注意一下棧為空的情況。

class

cqueue

public

void

(int value)

public

intdeletehead()

}// 如果此時 stack2 為空,說明隊列為空,返回 -1

if(stack2.

isempty()

)else}}

/** * your cqueue object will be instantiated and called as such:

* cqueue obj = new cqueue();

* int param_2 = obj.deletehead();

*/

劍指Offer刷題 用兩個棧實現佇列

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。本題要求用兩個棧實現佇列的入隊和出隊操作。入隊 由於棧是後進先出,佇列是先進先出。所以當兩個棧堆疊起來時,就能實現先進先出。只需要把資料放入到stack1中,然後再順序輸出放入到stack2中,但由於需要考慮到連續進入...

劍指 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...