標籤:except 分享圖片 兩個棧 gif oid str 先進先出 container ack
隊列先進先出。
棧先進後出。
最近看到一道面試題,要求用兩個棧類比一個隊列,這個問題在一年前遇到過,記錄一下。
使用棧類比隊列,一個肯定不行,首先想到用兩個棧來類比隊列。
當隊列有資料要入隊時,我們同時將這個資料入棧A
此時我們認為,第一次向隊列中插入資料完成了。則我們將A中的資料彈出,使用B來接收這些值。
就這樣將A中的元素全部彈出並且壓進B中,這時就會發現,他們順序逆轉,並且如同隊列一樣,先進的元素到了棧頂,可以先出。
我們讓1出隊之後,此時我們還想繼續向隊列中添加資料。
此時,2依然是棧B放在棧頂的元素。此時有新的元素加入,我們依然採取剛才的方法,在新資料入隊時,插入資料到棧A中。
插入棧A之後,我們可以對棧B進行判斷,如果棧B中還存有元素,則這名剛才添加的元素尚未全部出隊,他們仍然遵守先進先出的原則。
當棧B中的元素全部彈出之後,我們就可以將棧A中的元素再次彈出並壓進棧B,此時又實現了先進先出。
代碼實現:
private Stack<Integer> stackA = new Stack<Integer>();
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());
}
如何使用棧類比一個隊列