介绍
栈是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。换句话说,栈的修改是按先进后出的原则进行的。
因此,栈又称为后进先出(LastIn First Out,LIFO)的线性表。

类比
栈相当于弹夹,后压入 的子弹,最先弹出;先压入 的子弹,最后弹出

相关概念
栈顶(Top):栈中进行插入和删除操作的一端称为栈顶(Top)
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。
栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构
考点
入栈 不等于 出栈
看下面题
题(入栈不等于出栈)
习题:元素按照a、b、c的次序进入栈,请尝试写出其所有可能的出栈序列。
abc // a入栈,a出栈;b入栈,b出栈;c入栈,c出栈
acb // a入栈,a出栈;b入栈,c入栈,c出栈,b出栈;
cba // a入栈,b入栈,c入栈,c出栈,b出栈,a出栈
bca // a入栈,b入栈,b出栈,c入栈,c出栈,a出栈
bac // a入栈,b入栈,b出栈,a出栈,c入栈,c出栈
不会有 cab,a入栈,b入栈,c入栈,c出栈,之后只能是b出栈,不会是a出栈
题
判断一个表达式中左右括号是否匹配,采用( )实现较为方便。
A. 线性表的顺序存储
B. 队列
C. 线性表的链式存储
D. 栈
分析
以 {[()]} 为例,演示用栈的好处。
{[()]} 匹配规则是:内层括号必须先匹配,外层括号后匹配(最后出现的左括号,最先被匹配)——这正是栈“后进先出(LIFO)”的核心特性。
| 遍历字符 | 栈的操作 | 栈内元素(栈底→栈顶) | 匹配逻辑(核心) |
|---|---|---|---|
{ |
左括号 → push 入栈 | { |
记录“待匹配的外层左括号” |
[ |
左括号 → push 入栈 | {, [ |
记录“待匹配的中层左括号” |
( |
左括号 → push 入栈 | {, [, ( |
记录“待匹配的内层左括号(最后出现)” |
) |
右括号 → pop 栈顶 ( |
{, [ |
内层左括号(最后进)最先匹配(最先出),() 成对 |
] |
右括号 → pop 栈顶 [ |
{ |
中层左括号匹配,[] 成对 |
} |
右括号 → pop 栈顶 { |
空 | 外层左括号(最先进)最后匹配(最后出),{} 成对 |
最终结果:遍历结束,栈为空 → 所有括号完美匹配。
答案
D