InterviewGuide 刷题笔记:LeetCode 225 用队列实现栈——双队列与单队列解法详解
文档教程知识库【免费下载链接】InterviewGuide「InterviewGuide」是阿秀从校园-职场多年计算机自学过程的记录以及学弟学妹们计算机校招秋招经验总结文章的汇总包括但不限于C/C 、Golang、JavaScript、Vue、操作系统、数据结构、计算机网络、MySQL、Redis等学习总结坚持学习持续成长项目地址https://gitcode.com/forthespada/InterviewGuide点击查看免费下载导读「用队列实现栈」是 LeetCode 上经典的数据结构模拟题也是面试中高频考察的栈/队列互相模拟问题。本篇以 InterviewGuide 仓库中 225. 用队列实现栈 的题解为主体完整保留阿秀的 C 双队列实现并在此基础上补充算法原理、逐操作推演、复杂度分析与单队列优化方案。读完本篇你将掌握用队列模拟栈的标准套路并能举一反三地应对同类面试题。一、题目背景与考点1.1 为什么面试官爱考这道题栈Stack与队列Queue是两种完全相反的线性数据结构栈后进先出LIFO元素从同一端栈顶进、出队列先进先出FIFO元素从队尾进、从队首出。面试官通过这道题考察的正是你对两种数据结构本质差异的理解以及如何用受限的数据结构队列去模拟另一种数据结构的语义。本题在 InterviewGuide 中被归类于 精选力扣 300 道算法题之栈 分类下的 Easy 等级是栈专题入门必刷题之一。1.2 本题在栈专题中的定位在 07-栈/easy 目录下本题与 155. 最小栈用栈模拟栈 常数时间取最小、682. 棒球比赛、1047. 删除字符串中的所有相邻重复项 等共同构成栈的入门训练组而「用队列实现栈」恰好与栈专题中的 946. 验证栈序列 形成数据结构互操作的知识闭环。二、题目描述与约束条件题目要求使用队列实现栈的下列操作push(x)-- 元素 x 入栈pop()-- 移除栈顶元素top()-- 获取栈顶元素empty()-- 返回栈是否为空注意你只能使用队列的基本操作——也就是push to back、peek/pop from front、size和is empty这些操作是合法的你所使用的语言也许不支持队列你可以使用list或者deque双端队列来模拟一个队列只要是标准的队列操作即可你可以假设所有操作都是有效的例如对一个空的栈不会调用pop或者top操作。第三条约束非常关键它让我们在实现pop()和top()时无需处理空栈的边界情况代码可以更简洁。但作为严谨的工程实践本文仍会讨论空栈场景下需要注意的细节。三、核心思路队列与栈的本质差异队列是 FIFO栈是 LIFO。要让队列模拟出后进先出的效果核心矛盾在于队尾进入的元素正常情况下应该最先被弹出FIFO但栈却要求它最后被弹出。解决思路有两条主线思路策略代价双队列法本题解用第二个队列做中转站pop时把队尾元素以外的所有元素临时搬走pop变慢push保持 O(1)单队列法优化方案push时立即把新元素旋转到队首让队首永远等价于栈顶push变慢pop/top均为 O(1)两条主线各有取舍核心都是利用一次整体搬移/旋转来逆转元素的相对出队顺序。四、解法一双队列法原文档题解这是 225.用队列实现栈 原文档给出的第一版解法思路直白用一个主队列in存储数据用辅助队列out在弹出时充当缓冲区。4.1 完整代码阿秀原版class MyStack { public: /** Initialize your data structure here. */ MyStack() { } /** Push element x onto stack. */ void push(int x) { in.push(x); } /** Removes the element on top of the stack and returns that element. */ int pop() { while (in.size()1) { out.push(in.front()); in.pop(); } int iin.front(); in.pop(); while (!out.empty()) { in.push(out.front()); out.pop(); } return i; } /** Get the top element. */ int top() { return in.back(); } /** Returns whether the stack is empty. */ bool empty() { return in.empty() out.empty(); } private: queueint in; queueint out; };原文档记录的提交表现执行用时 4 ms击败 73.27% 的 C 提交内存消耗 9 MB击败 23.13% 的 C 提交。这里需要说明该数据是当时提交时的快照统计仅作参考实际表现随 LeetCode 评测机与用例集的变化会有波动。4.2 逐操作推演push(x)入栈直接把x压入主队列in的队尾时间复杂度 O(1)。in的队尾就是栈顶队首就是栈底。pop()出栈核心操作出栈要求弹出最后入栈的元素也就是in的队尾元素。但队列只能从队首弹出于是分三步走搬移while (in.size()1)将in中除队尾元素外的所有元素依次弹出并压入辅助队列out注意原顺序不变弹出此时in中只剩一个元素——也就是栈顶元素int i in.front(); in.pop();将其弹出并保存回迁while (!out.empty())将out中的元素按原顺序全部搬回in保证主队列数据完整、顺序不变。以入栈序列1 → 2 → 3为例初始 in: [1,2,3]队首 1队尾 3栈顶 3 pop(): 搬移后 in: [3]out: [1,2] 弹出 3返回 3 回迁后 in: [1,2]队尾 2新的栈顶 2每一次pop()的时间复杂度为 O(n)n 为栈内元素个数因为需要搬移n-1个元素再搬回。top()获取栈顶这里直接return in.back();。C 标准库的std::queue是容器适配器底层默认基于deque实现除了标准的push/pop/front之外还额外提供了back()方法返回队尾元素引用。由于入栈元素始终追加在in队尾且pop()之后剩余元素相对顺序不变in的队尾元素永远就是最后入栈的栈顶元素因此top()可以做到 O(1)。empty()判空return in.empty() out.empty();。理论上每次pop()结束时out都已被清空只判断in.empty()即可同时判断out属于防御性写法保证在任何状态下判空结果都正确时间复杂度 O(1)。4.3 复杂度总结双队列法操作时间复杂度说明push(x)O(1)直接入队pop()O(n)搬移 n-1 个元素 弹出一个 搬回 n-1 个元素top()O(1)直接返回队尾元素empty()O(1)判空空间复杂度O(n)两个队列合计存储全部元素从源码结构看该实现有一个值得注意的特点out队列只承担临时中转职责任何时刻都不保存数据因此空间上并没有因为双队列而翻倍仍是 O(n)。五、解法二单队列法push 时旋转双队列法让pop变慢了。如果我们换一个角度在push的时候就把新元素旋转到队首让队列的队首永远等价于栈顶那么pop/top都能回到 O(1)。这一版本不需要第二个队列仅靠一个队列的弹出-重新入队即可完成。class MyStack { public: /** Initialize your data structure here. */ MyStack() { } /** Push element x onto stack. */ void push(int x) { q.push(x); // 将新元素之前的 size-1 个元素依次从队首弹出并重新压回队尾 // 旋转完成后x 位于队首等价于栈顶 for (int i 0; i q.size() - 1; i) { q.push(q.front()); q.pop(); } } /** Removes the element on top of the stack and returns that element. */ int pop() { int x q.front(); // 队首即栈顶 q.pop(); return x; } /** Get the top element. */ int top() { return q.front(); // 队首即栈顶 } /** Returns whether the stack is empty. */ bool empty() { return q.empty(); } private: queueint q; };执行过程示例入栈1 → 2 → 3push(1): q[1] push(2): q[1,2]旋转 1 次 - [2,1]队首 2 即栈顶 push(3): q[2,1,3]旋转 2 次 - [3,2,1]队首 3 即栈顶 pop(): 返回并弹出队首 3 - [2,1]新的栈顶 2复杂度对比操作双队列法单队列法push(x)O(1)O(n)旋转 n-1 个元素pop()O(n)O(1)top()O(1)O(1)empty()O(1)O(1)空间O(n)O(n)两种方法本质上都是用一次 O(n) 的搬移/旋转换取另一种操作的 O(1)。如果业务场景中入栈频繁、出栈稀疏双队列法更优如果出栈频繁、入栈稀疏单队列法更优。面试时能主动对比这两种取舍是加分项。六、实现细节与易错点top()的in.back()依赖语言特性原解法之所以能用 O(1) 实现top()是因为 C 的std::queue提供了back()。如果面试语言是只提供push/pop/front的纯队列接口如部分语言的标准队列就需要通过弹出全部元素并记录队尾元素再恢复的方式模拟top()代价会变成 O(n)。这一点可以结合 155. 最小栈 中双栈同步保存状态的思路来体会数据结构模拟题的通用套路。out队列必须保持为空双队列法的正确性建立在每次pop()结束后out被清空这一不变量上。如果某次pop()执行到一半被中断现实中不会但思维上要保证out残留数据会导致后续行为错乱。空栈边界题目保证不会对空栈调用pop/top所以原代码没有判空。实际工程中建议在pop()/top()前增加if (empty())的防护避免queue::front()在空队列上调用引发未定义行为。关于只能用队列基本操作的约束注意题目允许使用list或deque模拟队列但不允许直接使用栈语义。也就是说不能用vector的push_back/pop_back偷懒必须严格通过队首出、队尾进的语义来实现。七、举一反三姊妹题与知识闭环在 InterviewGuide 的栈专题中与本题形成闭环的题目还有155. 最小栈用辅助栈同步记录当前最小值与本题用辅助队列做中转是同一类主结构 辅助结构的组合模式946. 验证栈序列考察栈的 push/pop 过程模拟与本题一样要求精确理解什么时刻该 pop、什么时刻该 push1047. 删除字符串中的所有相邻重复项与844. 比较含退格的字符串利用栈只能操作一端的特性做字符串处理是栈应用的常见变体。更进阶的姊妹题是232. 用栈实现队列方向相反用两个栈模拟先进先出它采用双栈 倒水的思路入队时压入in栈出队时若out栈为空则把in全部倒入out再从out弹出。理解了用队列实现栈后反向模拟题可以顺手攻克。全部栈专题题目清单及难度分级可参见 07-栈/introduce.md本专题的 Easy 级题解合集含 155、225、682、844、1047汇总于 total/07-栈/easy/easy.md适合集中刷题复盘。八、总结「225. 用队列实现栈」是一道典型的数据结构互模拟题目核心收获有三点理解本质栈的 LIFO 与队列的 FIFO 对立必须通过搬移/旋转来逆转出队顺序掌握套路双队列法中转搬移pop慢与单队列法push旋转push慢是两种标准答案要能讲清各自的复杂度取舍注意细节top()的 O(1) 实现依赖 Cqueue::back()跨语言时要意识到接口差异空栈防护与辅助结构的不变量是保证正确性的关键。无论校招还是社招面试能流畅写出双队列版本并主动补充单队列方案的候选人通常都能在栈与队列这一轮考察中顺利过关。赞分享文档教程知识库【免费下载链接】InterviewGuide「InterviewGuide」是阿秀从校园-职场多年计算机自学过程的记录以及学弟学妹们计算机校招秋招经验总结文章的汇总包括但不限于C/C 、Golang、JavaScript、Vue、操作系统、数据结构、计算机网络、MySQL、Redis等学习总结坚持学习持续成长项目地址https://gitcode.com/forthespada/InterviewGuide点击查看免费下载相关推荐LeetCode 225 题解用队列实现栈Implement Stack using Queues——Go 双队列实现与测试解析LeetCode 225 题解用队列实现栈Implement Stack using Queues——Go 双队列实现与测试解析 导读 本篇围绕 Leet示例工程用队列实现栈LeetCode 225双队列模拟 LIFO 的完整设计与复杂度分析用队列实现栈LeetCode 225双队列模拟 LIFO 的完整设计与复杂度分析 本文基于「算法通关手册」 0225. 用队列实现栈题解 https://教程文档知识库用队列实现栈三种解法与多语言实现深度剖析LeetCode 225 题用队列实现栈三种解法与多语言实现深度剖析LeetCode 225 题 本文围绕 LeetCode 225「用队列实现栈」展开系统讲解双队列、单队列、队列示例工程教程上一篇Gqrx完全指南15分钟快速上手开源SDR接收器免费收听全球无线电下一篇Orleans集成测试最佳实践环境隔离与数据清理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Koharu 运行时同步技能解析:用编码 Agent SKILL 维护 llama.cpp 与 stable-diffusion.cpp 绑定

Koharu 运行时同步技能解析:用编码 Agent SKILL 维护 llama.cpp 与 stable-diffusion.cpp 绑定

【免费下载链接】koharu ML-powered manga translator, written in Rust. 项目地址: https://gitcode.com/gh_mirrors/ko/koharu 点击查看 免费下载 本文围绕 Koharu 仓库中面向编码 Agent 的 runtime 技能(.agents/skills/runtime/SKILL.md&#xff09…

2026/10/12 1:36:52 阅读更多 →
蓝鲸配置平台(bk-cmdb)批量创建项目接口 batch_create_project 实战指南

蓝鲸配置平台(bk-cmdb)批量创建项目接口 batch_create_project 实战指南

后端企业应用运维 【免费下载链接】bk-cmdb 蓝鲸智云配置平台(BlueKing CMDB) 项目地址: https://gitcode.com/gh_mirrors/bk/bk-cmdb 点击查看 免费下载 本篇以 docs/apidoc/apigw/open/en/batch_create_project.md 为核心,结合 bk-cmdb 源码&#xff…

2026/10/12 1:36:52 阅读更多 →
浏览器里剪视频成真了:FilmCraft Web 版架构全拆解(WebCodecs + OPFS)

浏览器里剪视频成真了:FilmCraft Web 版架构全拆解(WebCodecs + OPFS)

浏览器里剪视频成真了:FilmCraft Web 版架构全拆解(WebCodecs OPFS) 【免费下载链接】filmcraft An open-source, clean-room reimplementation of Adobe Premiere Pro built in pure Rust. 项目地址: https://gitcode.com/gh_mirrors/fi/…

2026/10/12 1:36:52 阅读更多 →

最新新闻

【深度学习新浪潮】Meta Muse 智能体:它是什么?有哪些特点?为什么突然火了?

【深度学习新浪潮】Meta Muse 智能体:它是什么?有哪些特点?为什么突然火了?

1. 引言 近期,Meta Muse 智能体在 AI 领域引发广泛关注,开发者、创作者与科技从业者纷纷展开讨论。许多初次接触者不禁疑惑:这是 Meta 推出的又一款大模型?抑或仅是蹭热度的 AI 玩具? 事实并非如此。Meta Muse 是 Meta 在 AI 智能体方向的一次战略性布局,它并非简单的对…

2026/10/12 2:24:22 阅读更多 →
Spring-boot-3 -注解 yaml配置 -日志

Spring-boot-3 -注解 yaml配置 -日志

4、核心技能1. 常用注解SpringBoot 摒弃 XML 配置方式,改为全注解驱动1. 组件注册Configuration 自定义配置类、SpringBootConfiguration 用来标注SpringBoot主启动类的Bean 可以在自定义配置类面创建对象交给ioc容器,组件在容器中的名字为方法名、Scope…

2026/10/12 2:24:22 阅读更多 →
Neuroimage: 动态功能连接方法的重测信度比较

Neuroimage: 动态功能连接方法的重测信度比较

本篇文献发表在Neuroimage杂志。所发布内容旨在与大家分享学术新知,促进交流学习版权归原作者或原出处所有,感谢各位学者的辛勤付出与研究成果。1.引言大脑的功能组织具有丰富的时空结构,可以使用功能连接指标进行探测。功能连接被定义为两个…

2026/10/12 2:24:22 阅读更多 →
page_alloc __rmqueue

page_alloc __rmqueue

__rmqueue() 是伙伴系统分配路径的核心调度器。它在持有 zone->lock 的前提下,按照碎片化风险从低到高的顺序,依次尝试不同的分配策略,直到成功或彻底失败。核心作用与策略链它的本质是一个多级降级策略链:先尝试最“干净”的方…

2026/10/12 2:24:22 阅读更多 →
游戏引擎中物理步进与动画采样的同步机制解析

游戏引擎中物理步进与动画采样的同步机制解析

1. 这不是教科书,是我在三个项目里拆过七次引擎后写下的物理与动画系统手记“游戏引擎架构深度解析(三):物理与动画系统”——看到这个标题,你大概率正卡在某个角色落地时穿模、布料抖动像癫痫发作、或者刚加完一个新关…

2026/10/12 2:24:22 阅读更多 →
产业与汇率全景分析深入分析多表格形成一篇文章

产业与汇率全景分析深入分析多表格形成一篇文章

产业与汇率全景深度分析:汇率是外生变量,产业是底层根基引言汇率从来不是孤立的数字,它是一国产业竞争力、贸易结构、资本流动、宏观政策、全球供需格局共同定价的结果;反过来,汇率波动又会重塑产业成本、订单、利润、…

2026/10/12 2:23:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →