題目:用兩個棧實現一個隊列,只要求實現入隊,出隊方法即可.
假設這兩個棧分別為s1,s2
- 分析思路
1、棧的特性為:先進后出;隊列的特性為:先進先出;
2、如一個數組data[0] ~ data[n - 1]
,我們將它壓入s1
棧中,那么data[0]
在棧底,data[n - 1]
在棧頂;
3、如果我們對s1
棧中的元素執行出棧操作,并將出棧元素壓入s2
棧中,那么在s2
棧中data[n - 1]
在棧底,data[0]
在棧頂;
4、此時s2
棧中的元素再次出棧的話,順序即是:按照data[0] ~ data[n - 1]
的順序進行出棧,這就和隊列先進先出的順序相吻合. - 實現思路1
1、把s1
作為存儲空間,s2
作為臨時空間;
2、入棧時:把元素壓入s1
;
3、出棧時:把s1
中除棧底元素外的所有元素都倒入s2
,彈出s1
的棧底元素,然后把s2
中所有元素倒回s1
. - 實現思路2
1、把s1
作為存儲空間,s2
作為臨時空間;
2、入棧時,判斷s1
是否為空:
如不為空,說明所有元素都在s1
,直接將入棧元素壓入s1
;
如為空,將s2
中的所有元素倒回s1
,再將入棧元素壓入s1
;
3、出棧時,判斷s2
是否為空:
如不為空,直接彈出s2
的棧頂元素并出棧;
如為空,把s1
中除棧底元素外的所有元素都倒入s2
,然后彈出s1
的棧底元素. - 實現思路3 - 最佳方案
1、把s1
作為存儲空間,s2
作為臨時空間:
2、入棧時,將元素壓入s1
;
3、出棧時,判斷s2
是否為空:
如不為空,則直接彈出頂元素;
如為空,把s1
中除棧底元素外的所有元素都倒入s2
,然后彈出s1
的棧底元素.
最佳方案實現代碼:
class Stack4Queue<E> {
private Stack<E> s1 = new Stack<>();
private Stack<E> s2 = new Stack<>();
// 入隊列
public void push(E item) {
s1.push(item);
}
// 出隊列
public E pop() {
if (s2.empty()) {
if (s1.empty()) {
return null;
}
while (s1.size() != 1) {
s2.push(s1.pop());
}
return s1.pop();
}
return s2.pop();
}
}