← [ BACK_TO_NOTES ]

用栈实现队列

设计题:用输入栈和输出栈完成先进先出,关键在于延迟搬运元素。

#dev #algorithm #snippet #evergreen #leetcode #stack #queue

[!info] related notes 算法面试题型 MOC 栈 用队列实现栈

用栈实现队列

题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/

题型判断

这是典型设计题。

目标是用后进先出的栈,模拟先进先出的队列。

关键不在于“每次都立刻倒腾”,而在于:

什么时候真的需要把元素从输入栈搬到输出栈。

核心思路

维护两个栈:

  • inStack:负责入队
  • outStack:负责出队 / 看队头

流程:

  • push(x):直接压入 inStack
  • pop() / peek():如果 outStack 为空,就把 inStack 全部倒进去
  • empty():两个栈都为空才是真的空

为什么这样能保证 FIFO

因为:

  • 新元素总是先进 inStack
  • 当需要出队时,把 inStack 全部倒入 outStack
  • 顺序翻转后,最早入队的元素就会跑到 outStack 栈顶

这相当于做了一次“批量反转”。

JavaScript

class MyQueue {
    constructor() {
        this.inStack = [];
        this.outStack = [];
    }

    push(x) {
        this.inStack.push(x);
    }

    move() {
        if (!this.outStack.length) {
            while (this.inStack.length) {
                this.outStack.push(this.inStack.pop());
            }
        }
    }

    pop() {
        this.move();
        return this.outStack.pop();
    }

    peek() {
        this.move();
        return this.outStack[this.outStack.length - 1];
    }

    empty() {
        return this.inStack.length === 0 && this.outStack.length === 0;
    }
}

一句话总结

不要每次操作都倒栈,只有当 outStack 空了,才把 inStack 一次性倒过去。

每个元素最多入栈、搬运、出栈各一次,因此一串操作的单次摊销成本是 O(1),但触发搬运的一次 pop / peek 可达 O(n)。题目保证出队与查看队头时队列非空;这个 JavaScript 实现对空队列返回 undefined。

创建于 2026/3/19 更新于 2026/10/6
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本