題目:用兩個棧實(shí)現(xiàn)一個隊列,只要求實(shí)現(xiàn)入隊核行,出隊方法即可.
假設(shè)這兩個棧分別為s1,s2
- 分析思路
1蹬耘、棧的特性為:先進(jìn)后出芝雪;隊列的特性為:先進(jìn)先出;
2、如一個數(shù)組data[0] ~ data[n - 1]
婆赠,我們將它壓入s1
棧中绵脯,那么data[0]
在棧底,data[n - 1]
在棧頂;
3休里、如果我們對s1
棧中的元素執(zhí)行出棧操作,并將出棧元素壓入s2
棧中赃承,那么在s2
棧中data[n - 1]
在棧底妙黍,data[0]
在棧頂;
4、此時s2
棧中的元素再次出棧的話瞧剖,順序即是:按照data[0] ~ data[n - 1]
的順序進(jìn)行出棧拭嫁,這就和隊列先進(jìn)先出的順序相吻合. - 實(shí)現(xiàn)思路1
1、把s1
作為存儲空間抓于,s2
作為臨時空間;
2做粤、入棧時:把元素壓入s1
;
3、出棧時:把s1
中除棧底元素外的所有元素都倒入s2
捉撮,彈出s1
的棧底元素怕品,然后把s2
中所有元素倒回s1
. - 實(shí)現(xiàn)思路2
1、把s1
作為存儲空間巾遭,s2
作為臨時空間;
2肉康、入棧時闯估,判斷s1
是否為空:
如不為空,說明所有元素都在s1
吼和,直接將入棧元素壓入s1
;
如為空涨薪,將s2
中的所有元素倒回s1
,再將入棧元素壓入s1
;
3炫乓、出棧時刚夺,判斷s2
是否為空:
如不為空,直接彈出s2
的棧頂元素并出棧;
如為空末捣,把s1
中除棧底元素外的所有元素都倒入s2
侠姑,然后彈出s1
的棧底元素. - 實(shí)現(xiàn)思路3 - 最佳方案
1、把s1
作為存儲空間塔粒,s2
作為臨時空間:
2结借、入棧時,將元素壓入s1
;
3卒茬、出棧時船老,判斷s2
是否為空:
如不為空,則直接彈出頂元素;
如為空圃酵,把s1
中除棧底元素外的所有元素都倒入s2
柳畔,然后彈出s1
的棧底元素.
最佳方案實(shí)現(xiàn)代碼:
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();
}
}