day14-225. 用队列实现栈

225. 用队列实现栈

力扣题目链接(opens new window)

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

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

注意:

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

思路

和前面一道题不一样,使用队列实现栈时并不需要两个队列,因为队列先进先出的特点,即使n个队列也是先进先出,队列中的数据顺序不会改变。实际上我们只用一个队列就可以实现,另一个队列做备份。

由于栈的先进后出的特性,pop时队列的队尾是被弹出的对象,因此我们要想办法使得队列的对头为队尾,这种情况也就是队列中只有一个元素。所以我们用备份队列赞成队列中的后n-1个元素,再弹出第n个元素,然后再倒回去。

具体代码如下:

代码

class MyStack {
private:
    queue<int> Queue;
    queue<int> Queue_tmp;
public:
    MyStack() {
    }

    void push(int x) {
        Queue.push(x);
    }

    int pop() {
        while (Queue.size()!=1){
            Queue_tmp.push(Queue.front());
            Queue.pop();
        }
        int res = Queue.front();
        Queue.pop();
        while (!Queue_tmp.empty()){
            Queue.push(Queue_tmp.front());Queue_tmp.pop();
        }
        return res;
    }

    int top() {
        int res = this->pop();
        Queue.push(res);
        return res;
    }

    bool empty() {
        return Queue.empty();
    }
};

你可能感兴趣的:(算法,算法)