LeetCode No.225 用队列实现栈

486 阅读1分钟

使用队列实现栈的下列操作:

  • push(x) -- 元素 x 入栈
  • pop() -- 移除栈顶元素
  • top() -- 获取栈顶元素
  • empty() -- 返回栈是否为空

注意:

  • 你只能使用队列的基本操作-- 也就是 push to backpeek/pop from frontsize, 和 is empty 这些操作是合法的。
  • 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
  • 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。

题解

class MyStack {

    private Queue<Integer> queue;
    private Queue<Integer> reverseQueue;

    /**
     * Initialize your data structure here.
     */
    public MyStack() {
        queue = new LinkedList<>();
        reverseQueue = new LinkedList<>();
    }

    /**
     * Push element x onto stack.
     */
    public void push(int x) {
        reverseQueue.offer(x);
        while (!queue.isEmpty()) {
            reverseQueue.offer(queue.poll());
        }
        Queue temp = queue;
        queue = reverseQueue;
        reverseQueue = temp;
    }

    /**
     * Removes the element on top of the stack and returns that element.
     */
    public int pop() {
        return queue.poll();
    }

    /**
     * Get the top element.
     */
    public int top() {
        return queue.peek();
    }

    /**
     * Returns whether the stack is empty.
     */
    public boolean empty() {
        return queue.isEmpty();
    }
}

使用两个单向队列,每次push时,先将该值加入到reverseQueue中,将queue中所有元素压入到reverseQueue中,然后交换reverseQueue和queue。

1. push(1)

    reverseQueue:[1]  queue:[]

    reverseQueue:[]   queue:[1]

2. push(2)

    2.1 reverseQueue:[2]      queue:[1]

    2.2 reverseQueue:[2,1]    queue:[]

    2.3 reverseQueue:[]       queue:[2,1]

3. push(3)

    2.1 reverseQueue[3]         queue:[2,1]

    2.2 reverseQueue:[3,2,1]    queue:[]

    2.3 reverseQueue:[]         queue:[3,2,1]

4. top()

    3

5. pop()

    3  此时 reverseQueue:[]  queue:[2,1]