演算法學習 兩個棧實現乙個佇列

2021-07-09 20:00:49 字數 1891 閱讀 8370

問題描述:分析:

第一眼就能想到兩個做法,

(1) 入隊麻煩出隊容易:

宣告兩個棧,乙個是存資料用的棧(datastack),乙個是輔助用的棧(tempstack)。

入隊操作時,先將datastack中的所有元素出棧壓入tempstack中,然後將要入隊的元素壓入tempstack中,再將tempstack所有元素出棧到datastack,至此入隊成功,datastack棧頂元素就是第乙個入隊的元素(隊頭)。

出隊操作時,只需將datastack棧頂元素彈出返回就可以。

(2) 入隊容易出隊麻煩:

宣告兩個棧,乙個是存資料用的棧(datastack),乙個是輔助用的棧(tempstack)。

入隊操作時,只需要將入隊元素壓入datastack就可以。

出隊操作時,需要將datastack全部元素出棧到tempstack中,tempstack彈出元素返回,然後再將tempstack剩下元素全部出棧到datastack。

(1).入隊麻煩出隊容易

stackdatastack = new stack();

stacktempstack = new stack();

/** * 入隊

*@param item

*/public

void

tempstack.push(item);

while (!tempstack.isempty())

}/**

* 出隊

*@return

*@throws exception

*/public

intdeletehead()

(2).入隊容易出隊麻煩

stackdatastack = new stack();

stacktempstack = new stack();

/** * 入隊

*@param item

*/public

void

/** * 出隊

*@return

*@throws exception

*/public

intdeletehead() throws exception

int head=0;

while (!datastack.isempty())

head=tempstack.pop();

while (!tempstack.isempty())

return head;

}

思路:每次都要全部出棧全部出棧這樣太麻煩,時間複雜度有點大。優化方案就是宣告乙個入隊的棧(enstack)和乙個出隊的棧(destack)。

入隊時,將入隊元素壓入enstack中就可以。

出隊時,做個判斷,如果destack為空,就將enstack的元素全部出棧壓入destack中,然後將destack棧頂元素彈出返回即可。

這樣,確實優化了。

stackenstack=new stack(); // 用於入隊的表

stackdestack=new stack(); // 用於出隊的表

public

void

public

intdeletehead()

}// 如果destack為空會拋乙個emptystackexception異常,這我就不處理了。

return destack.pop();

}

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

這兩個題的思路比較相似。棧的特點是 先進後出 佇列的特點是 先進先出 不要怕!用兩個棧實現乙個佇列很簡單 再將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...