栈与队列数据结构解析及LeetCode经典题目实战

发布时间:2026/10/27 11:55:52

栈与队列数据结构解析及LeetCode经典题目实战 1. 栈与队列基础概念回顾在正式解题之前我们需要先明确几个核心概念。栈Stack是一种后进先出LIFO的数据结构只允许在一端称为栈顶进行插入和删除操作。想象一下餐厅里叠放的餐盘你总是取走最上面的那个新洗好的盘子也会放在最上面。队列Queue则是先进先出FIFO的结构就像排队买票的队伍先来的人先得到服务。它有两个基本操作入队enqueue在队尾添加元素出队dequeue从队首移除元素。在力扣题目中这两种数据结构经常以各种变形出现单调栈栈内元素保持单调递增或递减双端队列两端都可以进行插入和删除操作优先队列元素带有优先级出队顺序由优先级决定实际面试中面试官可能会要求你手写这些数据结构的实现。建议至少掌握数组和链表两种实现方式。2. 栈的经典题目解析2.1 有效的括号LeetCode 20这是栈结构最经典的入门题。给定一个只包含 (, ), {, }, [ 和 ] 的字符串判断字符串是否有效。解题思路初始化一个空栈遍历字符串遇到左括号就压栈遇到右括号就检查栈顶是否匹配匹配则弹出栈顶不匹配直接返回false最后检查栈是否为空def isValid(s: str) - bool: stack [] mapping {): (, }: {, ]: [} for char in s: if char in mapping: top stack.pop() if stack else # if mapping[char] ! top: return False else: stack.append(char) return not stack常见错误忘记处理栈为空时pop的情况或者最后没有检查栈是否为空。2.2 每日温度LeetCode 739给定一个温度列表要求返回一个列表表示需要等待多少天才能等到更暖和的温度。这是单调栈的典型应用。解法分析维护一个单调递减栈存储的是日期索引当当前温度大于栈顶温度时计算日期差并记录结果def dailyTemperatures(T: List[int]) - List[int]: stack [] res [0] * len(T) for i in range(len(T)): while stack and T[i] T[stack[-1]]: prev stack.pop() res[prev] i - prev stack.append(i) return res时间复杂度分析虽然看起来有嵌套循环但每个元素最多入栈出栈一次所以是O(n)时间复杂度。3. 队列的经典题目解析3.1 用栈实现队列LeetCode 232这道题要求使用栈的FILO特性来实现队列的FIFO特性。关键在于使用两个栈一个输入栈一个输出栈。实现要点入队时直接压入输入栈出队时如果输出栈为空将输入栈所有元素弹出并压入输出栈然后从输出栈弹出元素class MyQueue: def __init__(self): self.in_stack [] self.out_stack [] def push(self, x: int) - None: self.in_stack.append(x) def pop(self) - int: self._transfer() return self.out_stack.pop() def peek(self) - int: self._transfer() return self.out_stack[-1] def _transfer(self): if not self.out_stack: while self.in_stack: self.out_stack.append(self.in_stack.pop())面试陷阱面试官可能会追问各个操作的时间复杂度。最好情况O(1)最坏情况O(n)但均摊分析仍然是O(1)。3.2 滑动窗口最大值LeetCode 239这是单调队列的经典应用。给定一个数组和滑动窗口大小k找出每个窗口中的最大值。高效解法使用双端队列存储可能成为窗口最大值的元素索引队列中的元素按从大到小排列当新元素大于队尾元素时弹出队尾元素维护单调性检查队首元素是否还在窗口内def maxSlidingWindow(nums: List[int], k: int) - List[int]: from collections import deque q deque() res [] for i in range(len(nums)): while q and nums[i] nums[q[-1]]: q.pop() q.append(i) if q[0] i - k: q.popleft() if i k - 1: res.append(nums[q[0]]) return res时间复杂度每个元素最多入队出队一次O(n)时间复杂度。4. 栈与队列的混合应用4.1 用队列实现栈LeetCode 225与232题相反这次要用队列的FIFO特性实现栈的FILO特性。有两种主要实现方式方法一两个队列push时O(1)pop时O(n)入栈时直接加入非空队列出栈时将非空队列的前n-1个元素转移到另一个队列然后弹出最后一个元素方法二一个队列push时O(n)pop时O(1)入栈时先将新元素入队然后把前面的元素依次出队再入队出栈时直接出队# 方法二实现 class MyStack: def __init__(self): self.q collections.deque() def push(self, x: int) - None: self.q.append(x) for _ in range(len(self.q) - 1): self.q.append(self.q.popleft()) def pop(self) - int: return self.q.popleft()实际应用中根据使用场景选择实现方式。如果push操作频繁选择方法一如果pop操作频繁选择方法二。4.2 逆波兰表达式求值LeetCode 150这是栈在表达式求值中的典型应用。逆波兰表达式后缀表达式的特点是操作符在操作数之后。解题步骤初始化一个空栈遍历tokens遇到数字就压栈遇到操作符就弹出栈顶两个元素进行计算将结果压栈最后栈中剩下的就是结果def evalRPN(tokens: List[str]) - int: stack [] for token in tokens: if token not in -*/: stack.append(int(token)) else: b stack.pop() a stack.pop() if token : stack.append(a b) elif token -: stack.append(a - b) elif token *: stack.append(a * b) else: stack.append(int(a / b)) # 注意除法向零取整 return stack[0]特别注意Python的除法与题目要求可能不同需要使用int(a/b)而不是a//b因为//是向下取整。5. 高级应用与变形题目5.1 最小栈LeetCode 155设计一个支持push、pop、top操作并能在常数时间内检索到最小元素的栈。解法思路使用辅助栈同步记录当前最小值主栈压入元素时辅助栈压入当前最小值主栈弹出时辅助栈同步弹出class MinStack: def __init__(self): self.stack [] self.min_stack [float(inf)] def push(self, val: int) - None: self.stack.append(val) self.min_stack.append(min(val, self.min_stack[-1])) def pop(self) - None: self.stack.pop() self.min_stack.pop() def top(self) - int: return self.stack[-1] def getMin(self) - int: return self.min_stack[-1]空间优化辅助栈可以不存储所有状态只在遇到更小值时入栈等于当前最小值时也入栈。5.2 接雨水LeetCode 42这道题可以用单调栈、双指针或动态规划多种方法解决。这里展示单调栈解法def trap(height: List[int]) - int: stack [] res 0 for i in range(len(height)): while stack and height[i] height[stack[-1]]: bottom stack.pop() if not stack: break left stack[-1] width i - left - 1 bounded_height min(height[left], height[i]) - height[bottom] res width * bounded_height stack.append(i) return res理解要点栈中存储的是递减的柱子的索引当遇到更高的柱子时计算前面能接的雨水量雨水量 宽度 × (左右边界较小值 - 底部高度)6. 面试实战技巧与常见错误6.1 面试中的高频考点根据力扣和各大公司的面试统计栈与队列相关题目常考以下类型基础实现题用栈实现队列等括号匹配类问题单调栈应用接雨水、柱状图最大矩形滑动窗口问题表达式求值6.2 常见错误与调试技巧边界条件处理不足栈/队列为空时的操作输入为空或只有一个元素的情况数值溢出特别是Python不需要考虑但其他语言要注意复杂度分析错误误认为嵌套循环就是O(n²)忽略均摊分析如用栈实现队列的操作调试建议对于复杂问题先手动模拟小例子打印栈/队列的状态变化使用assert检查不变式6.3 性能优化思路空间换时间最小栈的辅助栈预处理某些信息如单调栈问题中预先计算左右边界算法选择滑动窗口问题优先考虑单调队列最近相关性问题如括号匹配优先考虑栈语言特性利用Python中collections.deque比list更适合队列实现某些情况下可以用位运算替代栈操作如括号匹配可以用计数器我在实际面试和刷题中发现很多同学对栈和队列的理解停留在表面。建议不仅要会做题还要理解每个操作背后的计算机科学原理。比如函数调用栈、消息队列在实际系统中的应用这些深度理解会让你在面试中脱颖而出。
延伸阅读

更多相关文章

2026/10/27 11:55:52

数据库系统概论复习指南:三级模式、SQL与事务并发核心考点

简介:这份完整Word版数据库系统概论期末考试试题,面向高校计算机专业学生及备考数据库原理类课程的读者,用于期末复习自测与知识点查漏补缺。压缩包内共1个doc文档,约170KB,内容按章节组织,覆盖数据库系统基…

2026/10/27 11:55:52

移动端SEO优化策略与实战指南

1. 移动端SEO优化的必要性解析 在2023年全球互联网流量统计中,移动设备访问量占比已突破63%,这个数字在电商领域更是高达72%。作为从业十年的SEO老兵,我亲眼见证了从PC端到移动端的流量迁移过程。现在不做移动端优化,就等于主动放…

2026/10/27 11:50:47

MATLAB块匹配全景拼接:从原理到工程实现与避坑指南

简介:MATLAB块匹配全景图像拼接源码包,面向图像处理学习者、计算机视觉初学者及需要完成课程设计或毕业设计的学生,解决多张图像融合为宽视野全景图时的配准与拼接难题。包内采用模块化设计,提供灰度与RGB双处理流程的主程序、特征…

2026/10/27 12:51:12

zip与chmod组合使用避坑指南:权限保留与自动化打包实践

1. 从一行报错说起:为什么“shell: zip/chmod”值得单独拎出来讲 如果你在终端里敲过打包命令,大概率见过类似 zip: command not found 或者 chmod: Operation not permitted 的提示。这两个命令一个负责压缩归档,一个负责改权限&#xf…

2026/10/27 12:51:12

多屏壁纸拼接神器OpenMontage:从坐标逻辑到自动化配置详解

不知道你有没有过这种经历:兴冲冲买了一台新显示器,组成了双屏甚至三屏工作台,结果发现一张完美的全景壁纸铺开之后,左右屏幕的图案对不齐,任务栏里还被拉伸得面目全非。折腾了壁纸设置里的"跨屏显示""…

2026/10/27 12:51:12

计算机网络第一章课后习题:交换方式、时延计算与体系结构通关

“计网第一章课后习题”这几个字,几乎是每个学网络的人都要过的一道关。第一章看似全是概念,真做起来却发现题目一点不“水”:交换方式要比较、性能指标要算、体系结构要讲清楚,稍微漏一个条件,答案就偏了。我见过太多…

2026/10/27 12:51:12

大模型烧钱的不止GPU:那份被CFO忽略的“隐性存储账单”

大模型烧钱的不止GPU:那份被CFO忽略的“隐性存储账单” 日均50万次AI调用,每天悄悄写出6-7GB数据。GPU账单你算了,存储账单大概率没人算。MIT Technology Review的最新报道点破了一个反直觉事实:推理(Inference&#x…

2026/10/27 12:51:12

营销技能体系化:硬技能、软技能、底层能力三维自检框架

直接说结论:营销技能这个事,大多数人都在用战术上的勤奋掩盖战略上的懒惰。天天刷爆款拆解、收藏话术模板、报了一堆训练营,真到做方案的时候,照样卡壳。问题出在哪?不是你不努力,是你东一榔头西一棒子&…

2026/10/27 12:46:12

AI-Ready Data四大基石:可追溯、语义一致、时效契约与可审计治理

1. 这不是AI训练前的“打扫卫生”,而是企业AI落地的生死线“AI-Ready Data”这个词最近在技术会议、架构师午餐和CTO周报里出现频率高得反常——它不像“大模型”或“Agent”那样自带光环,却总在项目卡壳时被反复提起。我去年帮三家制造业客户做预测性维…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/27 0:59:21

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式19_“模式选错”的典型代价

“模式选错”的典型代价 摘要 在软件工程中,设计模式、架构模式、并发模式乃至团队协作模式的选择,往往在项目早期就决定了后续的开发效率和维护成本。本文通过多个真实场景,剖析“模式选错”带来的典型代价——包括返工成本、技术债务累积、…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式20_新手推荐路径

新手推荐路径 摘要 在 AI 辅助开发工具快速普及的今天,新手面对最多的困惑往往不是"工具够不够强",而是"我该从哪一步开始用"。本文提出一条经过实践验证的三阶段学习路径:先从 Ask(问答式交互)起…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑