力扣每日一题day22[225. 用队列实现栈]

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppopempty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false

注意:

  • 你只能使用队列的基本操作 ------ 也就是 push to backpeek/pop from frontsizeis empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例:

复制代码
输入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]

解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

两个队列来实现栈:

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

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

但是依然还是要用两个队列来模拟栈,只不过没有输入和输出的关系,而是另一个队列完全用又来备份的!

java 复制代码
class MyStack {
​
    Queue<Integer> queue1; // 和栈中保持一样元素的队列
    Queue<Integer> queue2; // 辅助队列
​
    public MyStack() {
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }
    
    public void push(int x) {
        queue2.offer(x); // 先放在辅助队列中
        while (!queue1.isEmpty()){
            queue2.offer(queue1.poll());
        }
        Queue<Integer> queueTemp;
        queueTemp = queue1;
        queue1 = queue2;
        queue2 = queueTemp; // 最后交换queue1和queue2,将元素都放到queue1中
    }
    
    public int pop() {
        return queue1.poll(); // 因为queue1中的元素和栈中的保持一致,所以这个和下面两个的操作只看queue1即可
    }
    
    public int top() {
        return queue1.peek();
    }
​
    public boolean empty() {
        return queue1.isEmpty();
    }
}

一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时在去弹出元素就是栈的顺序了。

java 复制代码
class MyStack {
​
    Deque<Integer> queue;
​
    public MyStack() {
        queue=new LinkedList<>();
    }
    
    public void push(int x) {
        queue.add(x);
    }
    
    public int pop() {
        int size=queue.size();
        while(size>1){
            queue.add(queue.poll());
            size--;
        }
        return queue.poll();
    }
    
    public int top() {
        int size=queue.size();
        while(size>1){
            queue.add(queue.poll());
            size--;
        }
        int result=queue.peek();
        queue.add(queue.poll());
        return result;
    }
    
    public boolean empty() {
        return queue.isEmpty();
    }
}
相关推荐
吃喝不愁霸王餐APP开发者几秒前
Java应用对接美团开放平台API时的HTTPS双向认证与证书管理实践
java·开发语言·https
异界蜉蝣几秒前
前端模块化的演进史:从混乱到秩序
前端
宠..1 分钟前
QButtonGroup
java·服务器·开发语言·前端·数据库·c++·qt
码luffyliu1 分钟前
Go 语言并发编程:为何它能甩开 Java 等传统后端语言?
java·后端·golang·go
星火开发设计4 分钟前
快速排序详解:原理、C++实现与优化技巧
java·c++·算法·排序算法·快速排序·知识
一分之二~5 分钟前
回溯算法--全排列
c语言·数据结构·c++·算法·leetcode
写代码的【黑咖啡】6 分钟前
Python中的文件操作详解
java·前端·python
Moment9 分钟前
一文搞懂 Tailwind CSS v4 主题变量映射背后的原理
前端·javascript·面试
我命由我1234511 分钟前
JavaScript WebGL - WebGL 引入(获取绘图上下文、获取最大支持纹理尺寸)
开发语言·前端·javascript·学习·ecmascript·学习方法·webgl
辛-夷12 分钟前
2025年高频面试题整理(vue系列一)
前端·javascript·vue.js·前端框架