用兩個佇列模擬乙個棧

2021-07-04 02:34:19 字數 1685 閱讀 1133

有一段時間沒用c++和資料結構的東西了,感覺有點荒廢,今天呆著沒事把佇列實現棧這個問題動手用c++寫了一下。

入棧的時候直接插入乙個隊(記為a)的隊尾,出棧的時候由於要把a隊隊尾的元素取出,所以就把a中的元素除最後乙個外依次放到另乙個佇列b中,最後乙個直接丟棄。完成後把a和b互換,這樣下次入棧再插入到a隊尾即可。

假設b隊中元素的順序就是元素在棧中的順序,越新加入的越靠近隊首。再次入棧乙個元素,插入到乙個空的佇列a中,然後再把b中的元素依次插入a中,這樣由於b中的順序是由舊及新,而a隊隊首是最新的,所以a隊也是由舊及新。完成後把a和b互換,這樣方便下次操作。

**如下:

#include #include #include #include using namespace std;

/* *虛基類,定義了四個方法,pop(),push(),top()和emtpy()

*在基類中實現了empty()方法

*除兩個佇列外,還有兩個指向佇列的指標,用以指向用來入棧的佇列和用來出棧的佇列

*/class queuetostack

};/*

*一種用兩個佇列實現棧的方法,入棧時間複雜度為o(1),出棧時間複雜度為o(n)

*保證每次入棧元素加入push佇列隊尾

*push指標指向的佇列用來入棧,pop指標指向的佇列作為輔助,每次出棧將push佇列賦值到pop上並丟棄push隊尾元素作為出棧

*出棧完畢後將push和pop交換

*/class fastpush: public queuetostack ;

void fastpush::push(int n)

int fastpush::top()

void fastpush::pop()

push->pop();

swap(push,pop);}/*

*另一種實現方法,入棧操作是o(n),出棧操作是o(1)

*保證每次入棧之後,pop佇列的順序就是在棧中的順序

*push佇列作為輔助,每次入棧完畢後保證為空,入棧時,將元素加入push佇列,再將pop佇列複製到push佇列

*最後將push和pop佇列互換

*由於每次入棧完成後pop佇列中元素的順序都是棧順序的,所以入棧的時候只需要吧pop佇列賦值到push後邊

*/class fastpop: public queuetostack;

void fastpop::pop()

int fastpop::top()

void fastpop::push(int n)

swap(push,pop);

}int main()

for(int i=0;i<10;i++)

return 0;

}

執行結果:

g:\>queuetostack.exe

9 9 9

8 8 8

7 7 7

6 6 6

5 5 5

4 4 4

3 3 3

2 2 2

1 1 1

0 0 0

兩個棧模擬乙個佇列 兩個佇列模擬乙個棧

解題思路 插入操作在stack1中進行,刪除操作在stack2中進行,如果stack2為空,則將stack1中的所有元素轉移到stack2中。include include includeusing namespace std template class cqueue 建構函式 template ...

兩個棧模擬乙個佇列

兩個棧模擬乙個佇列,1號棧為入隊,棧頂表示隊尾 2號棧為出隊,棧頂表示隊首。入隊,直接進1號棧 出隊,先判斷2號棧是否有元素,有元素就直接彈出棧頂即隊首,如果2號棧沒有元素,則將1號棧的元素順序彈出並進2號棧。cpp view plain copy include include include u...

兩個佇列模擬乙個棧

上文給出了兩個棧模擬乙個佇列的解法,本文繼續解決兩個佇列模擬乙個棧的問題。先進先出變成先進後出,乍一想可能覺得不可能。但是這道題的前提是用兩個佇列,我們完全可以用其中乙個佇列queue1儲存好要出棧的元素,每當有新元素要入棧的時候就把他加到queue1中。怎麼讓queue1中的元素按出棧順序排列呢,...