劍指Offer7(兩個棧實現佇列)

2021-08-20 22:57:09 字數 1007 閱讀 6472

棧的原理是先進後出,而佇列的原理是先進先出,因此我們很容易下想到將資料先放到棧1,然後將棧1的資料一次pop出到棧2,這樣到了棧2再pop時,資料就是和一開始進入棧1的順序一樣了。

但是我們需要考慮乙個問題,那就是棧2是不是有值的情況,每次當棧1的資料pop到棧2時,我們都需要判斷棧2的資料是不是為空。比如:先向棧1push三個資料1、2、3,這個時候按照棧的規律將資料一次pop到棧2,即為:3、2、1,這個時候對於棧2來說,我們pop的順序就是想要的,這裡我們先pop兩次,即為:1、2,好,重點來了,3留在了棧2中,如果這個時候我們再push資料呢?

是的,我們需要考慮這種情況。棧1繼續接收資料:4,則4需不需要pop到棧2呢,如果進去了,棧2就變成了:3、4,是的3成為了棧底,4成了棧頂,這個時候再pop棧2的話順序就錯了,因為我們想要pop的是3,那麼怎麼解決呢?

我們可以加乙個判斷,只要棧2不為空,就不想其中push資料,也就是說4這個值繼續留在棧1中,等到棧為空的時候才可以push資料。那麼對於棧1會不會有影響呢,答案是不會。之前的4已經留在了棧1中,如果這個這個時候又push的資料5,棧1變成:4、5,我們很驚喜的發現這個順序依然是符合我們想要的結果的,因為如果這個時候棧2為空,將棧1的資料一次push到棧2的時候,棧2的資料為:5、4,然後我們pop資料,出來的依次是:4、5。

程式原始碼:

#include#includeusing namespace std;

class solution

int pop()

}temp=stack2.top();

stack2.pop();

return temp;

}private:

stackstack1;

stackstack2;

};int main()

{ solution tmp;

tmp.push(1);

tmp.push(2);

tmp.push(3);

cout結果展示:

劍指offer 7 使用兩個棧實現乙個佇列

棧 先進後出 佇列 先進先出 首先構建棧q1,q2。入佇列 入棧q1。出佇列 首先將q1中的所有元素依次壓入q2中,此時q1為空,q2中存放所有資料,在依次將q2中資料pop,即實現佇列。實現如下 include include include include using namespace std...

劍指offer 兩個棧實現佇列

使用兩個棧實現乙個佇列。棧是先進後出,佇列是後進先出。如果只有乙個棧那麼是無法實現佇列的,但是兩個棧完全可以。如下 templateclass cqueue templatet cqueue deletehead if stack2.size 0 throw queue is empty t ret...

劍指offer 兩個棧實現佇列

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。棧的特點是先入後處,先出。而佇列的特點是先入先出,後出。所以我們整兩個棧,入棧的時候入第乙個。出棧的時候如果另外乙個非空,則優先處理另乙個。如果空的話,把所有的元素再 先出的放到另一棧裡,負負得正,得到了佇列的效果。c...