劍指Offer 6 用兩個棧來實現乙個佇列。

2021-10-03 19:03:56 字數 1465 閱讀 9268

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

棧(stack):先進後出(不允許遍歷)

佇列(queue):先進先出(不允許遍歷)

劍指offer思路:

建立兩個棧stack1和stack2,使用兩個「先進後出」的棧實現乙個「先進先出」的佇列。

我們通過乙個具體的例子分析往該佇列插入和刪除元素的過程。首先插入乙個元素a,不妨先把它插入到stack1,此時stack1中的元素有,stack2為空。再壓入兩個元素b和c,還是插入到stack1中,此時stack1的元素有,其中c位於棧頂,而stack2仍然是空的。

這個時候我們試著從佇列中刪除乙個元素。按照先入先出的規則,由於a比b、c先插入佇列中,最先刪除的元素應該是a。元素a儲存在stack1中,但並不在棧頂,因此不能直接進行刪除操作。注意stack2我們一直沒有使用過,現在是讓stack2發揮作用的時候了。如果我們把stack1中的元素逐個彈出壓入stack2,元素在stack2中的順序正好和原來在stack1中的順序相反。因此經過3次彈出stack1和要入stack2操作之後,stack1為空,而stack2中的元素是,這個時候就可以彈出stack2的棧頂a了。此時的stack1為空,而stack2的元素為,其中b在棧頂。

因此我們的思路是:當stack2中不為空時,在stack2中的棧頂元素是最先進入佇列的元素,可以彈出。如果stack2為空時,我們把stack1中的元素逐個彈出並壓入stack2。由於先進入佇列的元素被壓倒stack1的棧底,經過彈出和壓入之後就處於stack2的棧頂,有可以直接彈出。如果有新元素d插入,我們直接把它壓入stack1即可。

流程示意圖:

總的意思就是利用兩個棧,push方法就是在stack1中直接壓入資料,但是刪除的時候由於要先進先出,利用第二個棧,此時第二個棧存在兩種情況,空與非空,非空時,頂部的肯定是先進來的(相比與被自己壓在下面的那個資料,此處可以理解為先是stack2先是空,後壓入資料,再做的刪除)。

**如下:

class

solution

intpop()

}int pop_num=stack2.

top();

stack2.

pop();

return pop_num;

}private

: stack<

int> stack1;

stack<

int> stack2;

};

今天又是划水的一天。明天周四了。

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

劍指offer 6.用兩個棧實現佇列 題目 思路 push的時候很容易 pop的時候需要保證能夠先進先出,因為stack本身是先進後出的,所以需要兩個stack導一下 複雜度pop一次需要o n 啟發或者坑 大概是溫習了stack的functions吧!class solution int pop ...

劍指offer 6,用棧來實現佇列(反之)

題目描述 用兩個棧來實現乙個佇列。有兩個棧,棧的特點是,元素先進後出,佇列的特點是,先進先出。所以進棧的那個不能用來出,得換乙個棧,得出,兩次先進後出後,就會得到進來時後得順序了。所以,當push 時 加入用棧1來進入資料 當pop 彈出資料時候,分情況了 如果此時棧2為空,就將所有的棧1中的元素壓...

劍指offer 用兩個棧實現佇列

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