問題描述:分析:(1).入隊麻煩出隊容易第一眼就能想到兩個做法,
(1) 入隊麻煩出隊容易:
宣告兩個棧,乙個是存資料用的棧(datastack),乙個是輔助用的棧(tempstack)。
入隊操作時,先將datastack中的所有元素出棧壓入tempstack中,然後將要入隊的元素壓入tempstack中,再將tempstack所有元素出棧到datastack,至此入隊成功,datastack棧頂元素就是第乙個入隊的元素(隊頭)。
出隊操作時,只需將datastack棧頂元素彈出返回就可以。
(2) 入隊容易出隊麻煩:
宣告兩個棧,乙個是存資料用的棧(datastack),乙個是輔助用的棧(tempstack)。
入隊操作時,只需要將入隊元素壓入datastack就可以。
出隊操作時,需要將datastack全部元素出棧到tempstack中,tempstack彈出元素返回,然後再將tempstack剩下元素全部出棧到datastack。
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...