劍指offer 用兩個棧實現佇列

2021-10-04 02:51:00 字數 1409 閱讀 5432

題目描述

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。 佇列中的元素為int型別。

解題思路

棧的特點:先進後出

佇列的特點:後進先出

例項說明

假設將元素 a ,插入到stack1中,此時 stack1 中的元素有,stack2 中為空,再向 stack1 中插入元素 b, c,此時stack1 中的元素有,stack2 中為空,如下圖所示:

如果現在要刪除乙個元素,按照佇列先進先出的特點,a 是最先插入到佇列中,那麼就用該刪除元素 a 。但是元素 a 現在存在 stack1中,由於棧是先進後出,此時棧頂元素為 c ,所以不能直接刪除元素 a ,已知沒有用到的stack2 終於要派上用場了。

如果將 stack1 中的元素彈出並壓入到 satck2 中,我們可以發現 stack2 中的元素順序正好與 stack1 中元素的順序相反,如下圖所示:

此時元素 a 處於 stack2 的棧頂,可以直接刪除。將元素 a 刪除後,下乙個進出佇列的元素是 b,= ,此時元素 b 正好處於 stack2 的棧頂,可以直接刪除。

通過上面的這個例子,我們可以總結出:

當 stack2 不為空時,在 stack2 中的棧頂元素是最先進入佇列中的元素,可以直接刪除;當 stack2 為空時,將 stack1 中的元素逐個彈出並壓入 stack2 中,經過這些操作, stack1 中最低端的元素會處於 stack2 的棧頂,這樣就可以直接刪除。

再來討論一下插入元素的問題,棧與佇列的插入元素的操作時一樣的,可以直接插入到 stack1 中,可能有人會有乙個疑惑,例如下面這個例子:

若現在要刪除乙個元素,此時 stack2 中不為空,說明先刪除 stack2 中的元素 c ,而不是刪除元素 d ,不過元素 c 確實在元素 d 之前插入,那麼先刪除的應該是元素 c 。

**實現

class

solution

intpop()

}int head = stack2.

top();

stack2.

pop();

return head;

}private

: stack<

int> stack1;

stack<

int> stack2;

};

劍指offer 用兩個棧實現佇列

華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 9 30 題目描述 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。解析 我的思路是用乙個棧來儲存資料,入隊的話直接在這個棧上入棧,出隊的話借助輔助棧,對輔助棧入棧,然後取出頭元素,然後把輔助棧上的元素在...

用兩個棧實現佇列《劍指offer

題目描述 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。解題思路 將元素入隊時壓入乙個棧中,隨後通過另乙個棧出隊 1 使用stack容器定義兩個棧 stack stack1 stack stack2 2 入隊 stack1.push node node為入隊元素 ...

劍指offer 用兩個棧實現佇列

記錄 劍指offer 上的演算法題。題目描述如下 佇列的宣告如下 template class cqueue cqueue t deletehead bool empty private stack stack1 stack stack2 實現的 如下 templatet stack1.push n...