数据结构-栈
更简单的介绍,在《程序是怎样跑起来的》一书中有简要形象的说明
一.栈的基本概念
栈是一种特殊的线性表,其插入删除操作都只能在表的尾部进行。
栈中允许插入、删除操作的一端称为栈顶,另一端称为栈底。
通常栈的插入操作叫入栈,栈的删除操作叫做出栈。
栈的插入和删除操作只允许在栈顶进行,每次入栈的元素即成为栈顶元素,每次最先出栈的总是栈顶元素,所以栈是一种后进先出的线性表。
![f89661a696cfd6a8701bd331e5faaf8b.png](https://img-blog.csdnimg.cn/img_convert/f89661a696cfd6a8701bd331e5faaf8b.png)
二.顺序栈
1.介绍
顺序栈是用数组实现的,因为入栈和出栈操作都是在栈顶进行的,所以增加变量top来指示栈顶元素的位置,top指向栈顶元素存储位置的下一个存储单元的位置,空栈时top=0。
2.基本操作
1)入栈操作
入栈操作push(x)是将数据元素x作为栈顶元素插入顺序栈中,主要操作如下:
- 判断顺序栈是否为满,若满则抛出异常
- 将x存入top所指的存储单元位置
- top加1
def
2)出栈操作
出栈操作pop()是将栈顶元素从栈中删除并返回,主要步骤如下:
- 判断顺序栈是否为空,若空则返回null
- top减1
- 返回top所指的栈顶元素的值
def
![fc947682ff410051f8f444d54cdea7cf.png](https://img-blog.csdnimg.cn/img_convert/fc947682ff410051f8f444d54cdea7cf.png)
3.应用
利用顺序栈实现括号匹配:
def
三.链栈
1.介绍
采用链式存储结构的栈称为链栈,由于入栈和出栈只能在栈顶进行,不存在在栈的任意位置进行插入和删除操作,所以不需要设置头节点,只需要将指针top指向栈顶元素节点。
![f6adeddcac9ade5c3d7a47108119a290.gif](https://img-blog.csdnimg.cn/img_convert/f6adeddcac9ade5c3d7a47108119a290.gif)
2.基本操作
1)入栈操作
入栈操作push(x)是将数据域为x的节点插入到链栈的栈顶,主要步骤如下:
- 构造数据值域为x的新节点
- 改变新节点和首节点的指针域,使新节点成为新的栈顶节点
def
![451cb2a023d332d0824036a995677bd0.png](https://img-blog.csdnimg.cn/img_convert/451cb2a023d332d0824036a995677bd0.png)
2)出栈操作
出栈操作pop()是将栈顶元素从链栈中删除并返回其数据域的值,主要步骤如下:
- 判断链栈是否为空,若空则返回null
- 修改top指针域的值,返回被删节点的数据域的值
def
![053329731d14ca33073d9668e9d4158b.png](https://img-blog.csdnimg.cn/img_convert/053329731d14ca33073d9668e9d4158b.png)