[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
    }
}
相关推荐
IT_陈寒3 分钟前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端
(Charon)11 分钟前
【C++】定时器进阶:使用最小堆管理定时任务
c++·算法
乘风gg13 分钟前
DeepSeek V4.1 Flash 来了,明天中午 Flash 降价 60%
前端·ai编程·claude
hansang_IR22 分钟前
【题解】 [省选联考 2021 A/B 卷] 卡牌游戏
c++·算法
默_笙35 分钟前
❗ 给金鱼装记忆(上):从白板到笔记本,AI 的短期记忆生存指南
前端·javascript
酷酷的逗逗乐36 分钟前
前端转 Agent 开发 · 第五节:Memory 会话记忆
前端·程序员
这个DBA有点耶1 小时前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
贾伟康1 小时前
【口算王|01】HarmonyOS ArkTS 口算题生成实战:按年级、运算类型和难度生成可控题目
算法·harmonyos·arkts·随机生成·口算题
掘金挖土1 小时前
前端手摸手跑路之 AI 应用开发(二)
前端·后端
lzx_0021 小时前
C++11(一)
开发语言·c++·算法