兩個棧實現乙個佇列。兩個佇列實現乙個棧

2022-08-25 18:06:26 字數 1360 閱讀 6204

兩個棧實現乙個佇列

方法一:我們先來說最笨的一種方法:倒棧

大多數人的思路是:始終維護s1作為儲存空間,以s2作為臨時緩衝區。

入隊時,將元素壓入s1。

出隊時,將s1的元素逐個「倒入」(彈出並壓入)s2,將s2的頂元素彈出作為出隊元素,之後再將s2剩下的元素逐個「倒回」s1。

見下面示意圖:

不得不說,這個方法雖然可行,但真的是有點笨。。。

方法二.加了乙個判斷s2是否為空的過程,減少倒棧次數

入佇列:直接壓入元素至s1即可

出佇列:如果s2不為空,把s2中的棧頂元素直接彈出。否則,把s1的所有元素全部彈出壓入s2中,再彈出s2的棧頂元素

乍看沒什麼問題了,但其實還是有個細節要考慮的。其實無論什麼方法和情況,都要考慮沒有元素可供出隊時的處理(2個棧都為空的時候,出隊操作一定會引起異常)(細節問題)

}兩個佇列實現乙個棧入隊時,誰空入誰,如果都空,則隨意,假設初始入的是q1

出隊時,把q1中的前size()-1個元素彈出,進入q2,彈出q1中的最後乙個元素,再把q2中前size()-1個元素彈入q1,將q2中的最後乙個元素出隊,迴圈往復

如果此過程中有新元素入隊,則哪個佇列是空的入哪個佇列。

template class cstack

~cstack(void)

{}t deletehead();

private:

queueq1;

queueq2;

}; else

}templatet cstack::deletehead()

ret = q2.front();

q2.pop();

}else

ret = q1.front();

q1.pop();

}return ret;

**參考:

兩個棧實現乙個佇列 兩個佇列實現乙個棧

這兩個題的思路比較相似。棧的特點是 先進後出 佇列的特點是 先進先出 不要怕!用兩個棧實現乙個佇列很簡單 再將top元素push到stack 2中,然後將stack 1 pop一次直到stack 1剩下最後乙個元素,這個就是最先push進去的,我們把它pop掉就可以了,同理,我們求queue的fro...

兩個棧實現乙個佇列,兩個佇列實現乙個棧

1 兩個棧實現乙個佇列 入隊時,直接壓入stack1中。出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,否則直接彈出stack2中的元素。入隊操作 void enqueue stack s1,stack s2,int m 出隊操作 void deq...

兩個棧實現乙個佇列 兩個佇列實現乙個棧

方法一 public class main 出棧操作 public int deletehead while stack1.isempty return stack2.pop 方法二 public class main public int deletehead throws exception i...