有一段時間沒用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中的元素按出棧順序排列呢,...