[232] 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 你 只能 使用标准的栈操作 ------ 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

示例 1:

scss 复制代码
输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

思路分析

做这道题大家首先要在心里清楚一个事情:栈和队列的区别在哪里?

仔细想想,栈,后进先出;队列,先进先出。也就是说两者的进出顺序其实是反过来的。用栈实现队列,说白了就是用栈实现先进先出的效果,再说直接点,就是想办法让栈底的元素首先被取出 ,也就是让出栈序列被逆序 。

乍一看有点头大:栈结构决定了栈底元素只能被死死地压在最底下,如何使它首先被取出呢?

一个栈做不到的事情,我们用两个栈来做

  • 思路 用两个栈维护
  • 当需要出栈时,把栈1的值 入栈到栈2,这时栈2便是倒序了 出列的时候栈2出栈
  • 注意:需要栈2的值为空时才能入到栈2,不然会打乱队列顺序

编码实现

ts 复制代码
class MyQueue {
    /*
    思路 用两个栈维护
    当需要出栈时,把栈1的值 入栈到栈2,这时栈2便是倒序了 出列的时候栈2出栈
    注意:需要栈2的值为空时才能入到栈2,不然会打乱队列顺序
    */ 
    stack1: number[];
    stack2: number[];
    constructor(){
        this.stack1 = []
        this.stack2 = []
    }
    push(x: number): void {
        this.stack1.push(x)
    }

    pop(): number {
    // 假如 stack2 为空,需要将 stack1 的元素转移进来
        if(this.stack2.length===0){
        // 当 stack1 不为空时,出栈
            while(this.stack1.length){
                this.stack2.push(this.stack1.pop()as number)
            }
        }
        return this.stack2.pop() as number
    }

    peek(): number {
        if(this.stack2.length===0){
            while(this.stack1.length){
                this.stack2.push(this.stack1.pop()as number)
            }
        }
        return this.stack2[this.stack2.length-1]
    }

    empty(): boolean {
        return !this.stack1.length && !this.stack2.length
    }
}
相关推荐
漂流瓶jz几秒前
UVA-11491 奖品的价值 题解答案代码 算法竞赛入门经典第二版
c++·算法·图论·题解·aoapc·算法竞赛入门经典·uva
weixin_307779134 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
hetao17338379 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
福兮说10 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
Zootopia62610 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan10 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
郑州光合科技余经理10 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆66611 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
2601_9603563811 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
Dovis(誓平步青云)11 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑