
🏠个人主页:黎雁
🎬作者简介:C/C++/JAVA后端开发学习者
❄️个人专栏:C语言、数据结构(C语言)、EasyX、游戏、规划、程序人生
✨ 从来绝巘须孤往,万里同尘即玉京

文章目录
- 栈和队列知识体系全梳理:从基础到实战一站式通关✨
-
- 文章摘要
- 一、基础筑基:栈和队列的核心概念
-
- [1. 栈(Stack):后进先出(LIFO)](#1. 栈(Stack):后进先出(LIFO))
- [2. 队列(Queue):先进先出(FIFO)](#2. 队列(Queue):先进先出(FIFO))
- [3. 栈与队列的本质区别](#3. 栈与队列的本质区别)
- 二、实现篇:栈和队列的两种实现方式
-
- [1. 栈的实现](#1. 栈的实现)
- [2. 队列的实现](#2. 队列的实现)
- [3. 实现方式选择建议](#3. 实现方式选择建议)
- 三、核心应用:栈和队列的典型使用场景
-
- [1. 栈的核心应用](#1. 栈的核心应用)
- [2. 队列的核心应用](#2. 队列的核心应用)
- 四、实战篇:栈和队列经典OJ题分类总结
-
- [1. 栈的经典OJ题](#1. 栈的经典OJ题)
- [2. 队列的经典OJ题](#2. 队列的经典OJ题)
- [3. 栈和队列的互实现问题](#3. 栈和队列的互实现问题)
- 五、学习建议与总结
栈和队列知识体系全梳理:从基础到实战一站式通关✨
你好!各位CSDN的小伙伴们~ 栈和队列作为两种经典的线性结构变种 ,看似简单,却是数据结构与算法领域的基础,更是面试中的高频考点。它们的核心区别在于数据的存取顺序,广泛应用于表达式求值、括号匹配、层序遍历等场景。今天这篇终章总结,将带大家一站式梳理栈和队列的完整知识体系,从基础概念到实现逻辑,从核心应用到经典OJ题,帮你彻底吃透栈和队列🚀
文章摘要
本文为数据结构系列栈与队列篇的终章总结,系统梳理栈和队列的完整知识体系。涵盖栈的后进先出、队列的先进先出核心特性,顺序表与链表两种实现方式的优劣对比。整合栈和队列的核心应用场景,分类总结表达式求值、括号匹配、层序遍历等经典OJ题解题思路与模板,助力读者构建系统化的知识框架,提升综合解题能力。
阅读时长 :约15分钟
适用人群:数据结构初学者、算法刷题备考者、技术面试冲刺者
一、基础筑基:栈和队列的核心概念
栈和队列均为线性结构,本质是对线性表的存取操作进行限制 ,形成两种不同的逻辑结构,核心区别在于出入顺序。
1. 栈(Stack):后进先出(LIFO)
- 核心定义 :限定仅在表尾进行插入和删除操作的线性表。表尾称为栈顶 ,表头称为栈底。
- 核心操作 :
- 入栈(push):在栈顶插入元素。
- 出栈(pop):删除并返回栈顶元素。
- 取栈顶(top):返回栈顶元素,不删除。
- 判空(empty):判断栈是否为空。
- 核心特性 :后进先出,最后入栈的元素最先出栈。
2. 队列(Queue):先进先出(FIFO)
- 核心定义 :限定仅在表尾进行插入操作,在表头进行删除操作的线性表。表尾称为队尾 ,表头称为队头。
- 核心操作 :
- 入队(push):在队尾插入元素。
- 出队(pop):删除并返回队头元素。
- 取队头(front):返回队头元素,不删除。
- 判空(empty):判断队列是否为空。
- 核心特性 :先进先出,最先入队的元素最先出队。
3. 栈与队列的本质区别
| 结构 | 核心特性 | 操作限制 | 应用场景 |
|---|---|---|---|
| 栈 | 后进先出(LIFO) | 仅栈顶可操作 | 表达式求值、括号匹配、递归回溯 |
| 队列 | 先进先出(FIFO) | 队尾入、队头出 | 层序遍历、任务调度、消息队列 |
二、实现篇:栈和队列的两种实现方式
栈和队列均可通过顺序表(数组)和链表实现,两种方式各有优劣,需根据场景选择。
1. 栈的实现
- 顺序栈(数组实现) :
- 优点:实现简单,存取速度快,缓存命中率高。
- 缺点:容量固定,扩容成本高。
- 核心设计:用数组存储元素,用一个变量
top记录栈顶下标(初始为-1)。
- 链栈(链表实现) :
- 优点:容量动态扩展,无需考虑扩容。
- 缺点:额外的指针空间开销,存取速度稍慢。
- 核心设计:用链表存储元素,通常选择头插法实现入栈和出栈(时间复杂度O(1))。
2. 队列的实现
- 顺序队列(数组实现) :
- 问题:普通顺序队列会出现假溢出(队尾已满但队头有空位)。
- 优化:采用循环队列,通过取模运算实现数组的循环使用,解决假溢出问题。
- 核心设计:用数组存储元素,用
front记录队头下标,rear记录队尾下标的下一个位置,通过(rear + 1) % capacity == front判断队列满。
- 链队列(链表实现) :
- 优点:容量动态扩展,无需考虑溢出。
- 核心设计:用双向链表存储元素,用
front指针指向队头,rear指针指向队尾,入队操作在队尾,出队操作在队头(时间复杂度O(1))。
3. 实现方式选择建议
- 若场景中元素数量固定或可预估,优先选择顺序实现(栈用顺序栈,队列用循环队列)。
- 若场景中元素数量动态变化,优先选择链表实现(链栈、链队列)。
三、核心应用:栈和队列的典型使用场景
栈和队列的应用场景均围绕其核心特性展开,掌握这些场景能快速定位解题思路。
1. 栈的核心应用
- 表达式求值:如中缀表达式转后缀表达式(逆波兰表达式),利用栈处理运算符的优先级。
- 括号匹配:判断字符串中的括号是否合法匹配,遇到左括号入栈,遇到右括号则弹出栈顶左括号进行匹配。
- 递归回溯:将递归算法转换为非递归算法,利用栈模拟递归调用栈(如二叉树的非递归遍历)。
- 单调栈:解决数组中元素的下一个更大/更小元素问题,时间复杂度可优化至O(n)。
2. 队列的核心应用
- 二叉树的层序遍历:利用队列的先进先出特性,实现二叉树的广度优先遍历,一层一层访问节点。
- 任务调度:如操作系统中的进程调度、打印机的任务队列,按照先到先服务的原则处理任务。
- 滑动窗口:解决滑动窗口中的最大值/最小值问题,利用双端队列(deque)维护窗口内的候选元素。
- 消息队列:在分布式系统中,用于实现异步通信、流量削峰等功能。
四、实战篇:栈和队列经典OJ题分类总结
栈和队列的OJ题多为基础题,但容易考察细节,以下是高频考点的解题模板和思路。
1. 栈的经典OJ题
- 括号匹配问题(LeetCode 20) :
- 解题思路:遍历字符串,左括号入栈,右括号则判断栈顶是否为对应的左括号,若匹配则出栈,否则返回false。遍历结束后,若栈为空则返回true,否则返回false。
- 核心技巧:利用栈的后进先出特性,处理嵌套的括号结构。
- 有效的括号字符串(LeetCode 678) :
- 解题思路:使用两个栈,分别存储左括号和星号的下标,遍历字符串时进行匹配,最后检查剩余的左括号是否能被星号匹配。
- 核心技巧:星号可以作为左括号、右括号或空,需结合下标判断是否合法。
2. 队列的经典OJ题
- 二叉树的层序遍历(LeetCode 102) :
- 解题思路:利用队列辅助,先将根节点入队,然后循环取出队头节点,访问该节点后将其左、右孩子入队,直到队列为空。
- 核心技巧:队列的先进先出特性,保证一层一层遍历。
- 用栈实现队列(LeetCode 232) :
- 解题思路:使用两个栈,一个输入栈(用于入队),一个输出栈(用于出队)。出队时,若输出栈为空,则将输入栈的所有元素弹出并压入输出栈,然后从输出栈弹出元素。
- 核心技巧:利用两个栈的后进先出特性,模拟队列的先进先出特性。
3. 栈和队列的互实现问题
- 用栈实现队列 、用队列实现栈 是面试中的高频题,核心思路是用两个结构的特性相互模拟,需注意操作的时间复杂度优化。
五、学习建议与总结
- 理解核心特性:栈的后进先出和队列的先进先出是所有问题的核心,解题时首先考虑是否能利用这两个特性。
- 掌握实现细节:顺序栈的扩容、循环队列的判满与判空、链栈和链队列的指针操作,这些细节是面试中常考察的点。
- 多做实战练习:通过表达式求值、括号匹配、层序遍历等经典题目,加深对栈和队列的理解,总结解题模板。
- 关注进阶应用:单调栈、双端队列等进阶结构,是解决复杂问题的关键,需在掌握基础后进一步学习。
栈和队列作为基础数据结构,是学习后续高级数据结构和算法的基石。掌握它们的核心概念、实现方式和应用场景,不仅能应对算法面试,更能在实际开发中灵活运用。
希望这篇总结能帮助大家一站式通关栈和队列!如果觉得有帮助,欢迎点赞+收藏+关注,后续将持续更新数据结构与算法的相关内容~😜