跳转至

232.用栈实现队列 (Easy)*

题目描述*

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

  • push(x) -- 将一个元素放入队列的尾部。
  • pop() -- 从队列首部移除元素。
  • peek() -- 返回队列首部的元素。
  • empty() -- 返回队列是否为空。

说明*

你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。

你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

代码*

双栈实现,入队时把 outStack 出栈放入 inStack 然后再将 x 入栈。出队时把 inStack 出栈放入 outStack,移除 outStack 栈顶。取队首元素则将 inStack 放入 outStack 取 inStack 栈顶。

可以简化,用 front 变量保存第一个入队的元素。入队直接放入 inStack,出队时如果 outStack 为空,则将 inStack 放入 outStack,移除 outStack 栈顶。取队首元素,如果 outStack 为空则返回 front 变量。

class MyQueue {
private:
    stack<int> inStack;
    stack<int> outStack;

public:
    /** Initialize your data structure here. */
    MyQueue() {}

    /** Push element x to the back of queue. */
    void push(int x) {
        // inStack.push(x);
        while(!outStack.empty()) {
            inStack.push(outStack.top());
            outStack.pop();
        }
        inStack.push(x);
    }

    /** Removes the element from in front of queue and returns that element. */
    int pop() { 
        while(!inStack.empty()) {
            outStack.push(inStack.top());
            inStack.pop();
        }
        int res = outStack.top();
        outStack.pop();
        return res;
    }

    /** Get the front element. */
    int peek() {
        while(!inStack.empty()) {
            outStack.push(inStack.top());
            inStack.pop();
        }
        return outStack.top();
    }

    /** Returns whether the queue is empty. */
    bool empty() {
        return inStack.empty() && outStack.empty();
    }
};
class MyQueue {
private:
    stack<int> inStack;
    stack<int> outStack;
    int front;
public:
    /** Initialize your data structure here. */
    MyQueue() {}

    /** Push element x to the back of queue. */
    void push(int x) {
        if(inStack.empty()) {
            front = x;
        }
        inStack.push(x);
    }

    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        if(outStack.empty()) {
            while(!inStack.empty()) {
                outStack.push(inStack.top());
                inStack.pop();
            }
        }
        int res = outStack.top();
        outStack.pop();
        return res;
    }

    /** Get the front element. */
    int peek() {
        if(!outStack.empty()) {
            return outStack.top();
        }
        return front;
    }

    /** Returns whether the queue is empty. */
    bool empty() {
        return inStack.empty() && outStack.empty();
    }
};

最后更新: July 23, 2022