1. 程式人生 > 其它 >60.用棧實現佇列

60.用棧實現佇列

請你僅使用兩個棧實現先入先出佇列。佇列應當支援一般佇列支援的所有操作(push、pop、peek、empty):

實現 MyQueue 類:

void push(int x) 將元素 x 推到佇列的末尾
int pop() 從佇列的開頭移除並返回元素
int peek() 返回佇列開頭的元素
boolean empty() 如果佇列為空,返回 true ;否則,返回 false
說明:

你 只能 使用標準的棧操作 —— 也就是隻有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的語言也許不支援棧。你可以使用 list 或者 deque(雙端佇列)來模擬一個棧,只要是標準的棧操作即可。

/*
 解題思路
佇列的特性是 FIFOFIFO(先入先出),而棧的特性是 FILOFILO(先入後出)。

知道兩者特性之後,我們需要用兩個棧來模擬佇列的特性,一個棧為入隊棧,一個棧為出對棧。

當出隊棧存在內容時,出隊棧的棧頂,即為第一個出隊的元素。

若出隊棧無元素,我們的需求又是出隊的話,我們就需要將入隊棧的內容反序匯入出隊棧,然後彈出棧頂即可。

注意:根據棧的的特性,我們僅能使用 pushpush 和 poppop 操作。
*/

class MyQueue {
    Deque<Integer> inStack;
    Deque<Integer> outStack;

    public MyQueue() {
        inStack = new LinkedList<Integer>();
        outStack = new LinkedList<Integer>();
    }
    
    public void push(int x) {
        inStack.push(x);
    }
    
    public int pop() {
        if (outStack.isEmpty()) {
            in2out();
        }
        return outStack.pop();
    }
    
    public int peek() {
        if (outStack.isEmpty()) {
            in2out();
        }
        return outStack.peek();
    }
    
    public boolean empty() {
        return inStack.isEmpty() && outStack.isEmpty();
    }

    private void in2out() {
        while (!inStack.isEmpty()) {
            outStack.push(inStack.pop());
        }
    }
}