示例 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...