[232] 用栈实现队列

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

实现 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
    }
}
相关推荐
LaughingZhu6 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
怕浪猫6 小时前
Electron 开发实战(一):从零入门核心基础与环境搭建
前端·electron·ai编程
小鹏linux7 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
心中有国也有家7 小时前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”
经验分享·笔记·学习·算法
前端若水8 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
绝知此事8 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
Bigger8 小时前
mini-cc:一个轻量级 AI 编程助手的诞生
前端·ai编程·claude
碧海银沙音频科技研究院8 小时前
通话AEC与语音识别AEC的软硬回采链路
深度学习·算法·语音识别
涵涵(互关)8 小时前
Naive-ui树型选择器只显示根节点
前端·ui·vue
BY组态8 小时前
Ricon组态系统最佳实践:从零开始构建物联网监控平台
前端·物联网·iot·web组态·组态