隊列先進先出。
棧先進后出。
最近看到一道面試題,要求用兩個棧模擬一個隊列,這個問題在一年前遇到過,記錄一下。
使用棧模擬隊列,一個肯定不行,首先想到用兩個棧來模擬隊列。
當隊列有數據要入隊時,我們同時將這個數據入棧A

此時我們認為,第一次向隊列中插入數據完成了。則我們將A中的數據彈出,使用B來接收這些值。

就這樣將A中的元素全部彈出並且壓進B中,這時就會發現,他們順序逆轉,並且如同隊列一樣,先進的元素到了棧頂,可以先出。
我們讓1出隊之后,此時我們還想繼續向隊列中添加數據。

此時,2依然是棧B放在棧頂的元素。此時有新的元素加入,我們依然采取剛才的方法,在新數據入隊時,插入數據到棧A中。
插入棧A之后,我們可以對棧B進行判斷,如果棧B中還存有元素,則這名剛才添加的元素尚未全部出隊,他們仍然遵守先進先出的原則。
當棧B中的元素全部彈出之后,我們就可以將棧A中的元素再次彈出並壓進棧B,此時又實現了先進先出。
代碼實現:
-
-
private Stack<Integer> stackB = new Stack<Integer>(); -
-
/** -
* 入隊操作 -
* @param element 入隊的元素 -
*/ -
public void enQueue(int element) { -
stackA.push(element); -
} -
-
/** -
* 出隊操作 -
*/ -
public Integer deQueue() { -
if(stackB.isEmpty()){ -
if(stackA.isEmpty()){ -
return null; -
} -
transfer(); -
} -
return stackB.pop(); -
} -
``
-
``
-
/** -
* 棧A元素轉移到棧B -
*/ -
private void transfer(){ -
while (!stackA.isEmpty()){ -
stackB.push(stackA.pop()); -
} -
} -
``
-
``
-
public static void main(String[] args) throws Exception { -
StackQueue stackQueue = new StackQueue(); -
stackQueue.enQueue(1); -
stackQueue.enQueue(2); -
stackQueue.enQueue(3); -
System.out.println(stackQueue.deQueue()); -
System.out.println(stackQueue.deQueue()); -
stackQueue.enQueue(4); -
System.out.println(stackQueue.deQueue()); -
System.out.println(stackQueue.deQueue()); -
