leetcode-master/problems/0225.用队列实现栈.md

2.7 KiB
Raw Blame History

题目地址

https://leetcode-cn.com/problems/implement-stack-using-queues/

思路

有的同学可能疑惑这种题目有什么实际工程意义,其实很多算法题目主要是对知识点的考察和教学意义远大于其工程实践的意义,所以面试题也是这样!

相信做过0232.用栈实现队列这道题目的部分同学会依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,其实不是这样的。

队列是先进先出的规则,你把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并有变成先进后出的顺序。

所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。

如下面动画所示,用两个队列que1和que2实现队列的功能que2其实完全就是一个备份的作用把que1最后面的元素以外的元素都备份到que2然后弹出最后面的元素再把其他元素从que2导回que1。

模拟的队列执行语句如下: queue.push(1); queue.push(2);
queue.pop();
queue.push(3); queue.push(4);
queue.pop(); queue.pop(); queue.pop(); queue.empty();

详细如代码注释所示:

C++代码

class MyStack {
public:
    queue<int> que1;
    queue<int> que2; // 辅助队列
    /** Initialize your data structure here. */
    MyStack() {

    }

    /** Push element x onto stack. */
    void push(int x) {
        que1.push(x);
    }

    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        int size = que1.size();
        size--;
        while (size--) { // 将que1 导入que2但要留下最后一个元素
            que2.push(que1.front());
            que1.pop();
        }

        int result = que1.front(); // 留下的最后一个元素就是我们要返回的值
        que1.pop();
        que1 = que2; // 再将que2赋值给que1
        while(!que2.empty()) { // 清空que2
            que2.pop();
        }
        return result;
    }

    /** Get the top element. */
    int top() {
        return que1.back();
    }

    /** Returns whether the stack is empty. */
    bool empty() {
        return que1.empty();
    }
};

更多算法干货文章持续更新可以微信搜索「代码随想录」第一时间围观关注后回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等就可以获得我多年整理的学习资料。