在数据结构的世界中,栈(Stack)和队列(Queue)是最基础、最常用的两种线性数据结构,几乎所有高级数据结构和算法的底层都离不开它们。无论是日常开发中的浏览器回退、消息排队,还是算法刷题中的括号匹配、广度优先搜索,栈和队列都在默默发挥作用。
今天这篇博客,用通俗易懂的语言+实战代码,带你彻底吃透栈和队列的核心知识点,搞定入门必考重难点!
一、什么是线性数据结构?
栈和队列都属于线性数据结构,简单来说:数据元素是一对一的线性排列,所有元素都在一条直线上。
二者的核心区别不在于存储结构,而在于数据的存取规则:栈是“后进先出”,队列是“先进先出”,这也是贯穿所有知识点的核心。
二、栈(Stack):后进先出的容器
1. 核心特性
栈的规则:LIFO(Last In First Out)后进先出
通俗理解:像一个垂直的笔筒、叠放的盘子。最后放进去的盘子,会被最先拿出来;最先放的盘子,只能等后面的全部取出后才能取出。
栈有两个专属核心操作:
-
入栈(push):向栈顶添加元素
-
出栈(pop):从栈顶删除元素
⚠️ 注意:栈所有的增删操作,只能在栈顶完成,栈底固定不动,中间元素无法直接访问、修改、删除。
2. 栈的常见场景
-
浏览器后退功能:每打开一个页面入栈,点击后退弹出上一个页面
-
编辑器撤销操作(Ctrl+Z):每次操作记录入栈,撤销即出栈
-
算法刷题:括号匹配、逆波兰表达式、字符串反转
-
程序底层:函数调用栈(递归的底层实现)
3. Python 栈实战代码
Python 中没有专门的栈结构体,可直接用 列表 list 模拟栈,简单高效:
# 初始化栈 stack = [] # 1. 入栈 push stack.append(1) stack.append(2) stack.append(3) print("入栈后栈内元素:", stack) # [1, 2, 3] # 2. 出栈 pop(默认弹出栈顶最后一个元素) stack.pop() print("第一次出栈后:", stack) # [1, 2] # 3. 获取栈顶元素 print("栈顶元素:", stack[-1]) # 2 # 4. 判断栈是否为空 print("栈是否为空:", len(stack) == 0) # False
三、队列(Queue):先进先出的通道
1. 核心特性
队列的规则:FIFO(First In First Out)先进先出
通俗理解:像超市排队、水管流水。先排队的人先结账,先进入管道的水先流出,绝对遵循顺序原则。
队列的两个专属核心操作:
-
入队(enqueue):向队尾添加元素
-
出队(dequeue):从队头删除元素
队列规则:队尾入、队头出,中间元素同样无法直接操作。
2. 队列的常见场景
-
消息队列:微信消息、短信推送,按发送顺序接收
-
任务排队:打印机多文件打印、服务器请求处理
-
算法刷题:广度优先搜索(BFS)、层次遍历
-
操作系统:进程排队、线程池任务调度
3. Python 队列实战代码
Python 中推荐使用内置模块 collections.deque 实现队列,出队、入队时间复杂度为 O(1),效率远高于列表:
from collections import deque # 初始化队列 queue = deque() # 1. 入队 append(队尾添加元素) queue.append("任务1") queue.append("任务2") queue.append("任务3") print("入队后队列元素:", list(queue)) # ['任务1', '任务2', '任务3'] # 2. 出队 popleft(队头弹出元素) queue.popleft() print("第一次出队后:", list(queue)) # ['任务2', '任务3'] # 3. 获取队头元素 print("队头元素:", queue[0]) # 任务2 # 4. 判断队列是否为空 print("队列是否为空:", len(queue) == 0) # False
四、栈和队列核心区别(重点总结)
这是面试、笔试高频考点,一张对照表彻底理清:
|
对比维度 |
栈(Stack) |
队列(Queue) |
|---|---|---|
|
存取规则 |
后进先出 LIFO |
先进先出 FIFO |
|
操作位置 |
仅栈顶增删元素 |
队尾入、队头出 |
|
核心场景 |
撤销、回溯、递归、括号匹配 |
排队、消息分发、BFS 遍历 |
|
Python实现 |
list.append() / list.pop() |
deque.append() / deque.popleft() |
五、拓展:经典变形结构
1. 单调栈
在普通栈的基础上,保证栈内元素单调递增/递减,常用于解决下一个更大元素、接雨水、柱状图最大矩形等经典算法题,是笔试高频技巧。
2. 双端队列(deque)
两端都可以入队、出队,兼具栈和队列的特性,灵活度更高,可适配更多复杂场景。
3. 优先队列
不遵循先进先出,而是按照元素优先级排序,优先级高的先出队,底层通常由堆实现,常用于任务优先级调度、最短路径算法(Dijkstra)。
六、学习总结
1. 栈和队列是线性数据结构的基石,核心差异只有一句话:栈倒序存取,队列顺序存取;
2. 开发中栈多用于回溯、撤销、递归场景,队列多用于排队、异步任务、遍历场景;
3. Python 实操优先用 list 实现栈、deque 实现队列,时间复杂度最优;
4. 掌握基础后,可重点刷题练习单调栈、队列BFS,快速提升算法能力。
后续会持续更新栈队列经典刷题解析、手写底层实现,感兴趣可以收藏关注!

被折叠的 条评论
为什么被折叠?



