严蔚敏《数据结构》(C语言版)【教材精讲+考研真题解析】讲义与视频课程【36小时高清视频】
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.1 栈

视频二维码(扫码观看)

一、抽象数据类型栈的定义

1栈的概念

栈(Stack):是限定仅在表的一端进行插入和删除操作的线性表。又称为后进先出LIFO(Last In First Out)或先进后出FILO(First In Last Out)线性表。

栈顶(Top):允许进行插入、删除操作的一端,又称为表尾。用栈顶指针(top)来指示栈顶元素。

栈底(Bottom):是固定端,又称为表头。

空栈:当栈中没有元素时称为空栈。

设栈S=(a1,a2,…,an),则a1称为栈底元素,an为栈顶元素,如图3-1所示。

栈中元素按a1,a2,…,an的次序进栈,退栈的第一个元素应为栈顶元素。即栈的修改是按后进先出的原则进行的。

图3-1 顺序栈示意图

2栈的抽象数据类型定义

二、栈的表示和实现

栈的顺序存储结构简称为顺序栈,和顺序表相类似,用一维数组来存储栈。根据数组容量是否可以按需变化,又可分为静态顺序栈和动态顺序栈。

静态顺序栈实现简单,但不能根据需要增大栈的存储空间;

动态顺序栈可以根据需要增大栈的存储空间,但实现稍为复杂。

1栈的动态顺序存储表示

采用动态一维数组来存储栈。所谓动态,指的是栈的大小可以根据需要增加。

用bottom表示栈底指针,栈底固定不变的;用top表示栈顶指针,栈顶则随着进栈和退栈操作而变化。

用top=bottom作为栈空的标记,每次top指向栈顶数组中的下一个存储位置。

结点进栈:首先将数据元素保存到栈顶(top所指的当前位置),然后执行top加1,使top指向栈顶的下一个存储位置;

结点出栈:首先执行top减1,使top指向栈顶元素的存储位置,然后将栈顶元素取出。

动态堆栈变化示意图如图3-2所示。

图3-2 (动态)堆栈变化示意图

视频二维码(扫码观看)

基本操作的实现:

栈的类型定义

栈的初始化

压栈(元素进栈)

弹栈(元素出栈)

2栈的静态顺序存储表示

采用静态一维数组来存储栈。

栈底固定不变的;栈顶则随着进栈和退栈操作而变化。

用top=0表示栈空的初始状态,每次top指向栈顶在数组中的存储位置。

结点进栈:首先执行top加1,使top指向新的栈顶位置,然后将数据元素保存到栈顶(top所指的当前位置)。

结点出栈:首先把top指向的栈顶元素取出,然后执行top减1,使top指向新的栈顶位置。

若栈的最大容量为Maxsize,则top=Maxsize-1时栈满。图3-3是一个大小为5的栈的变化示意图。

图3-3 静态堆栈变化示意图

基本操作的实现:

栈的类型定义

栈的初始化

压栈(元素进栈)

弹栈(元素出栈)

当栈满时做进栈运算必定产生空间溢出,简称“上溢”。上溢是一种出错状态,应设法避免。

当栈空时做出栈运算也将产生溢出,简称“下溢”。下溢则可能是正常现象,因为栈在使用时,其初态或终态都是空栈,所以下溢常用来作为控制转移的条件。

三、栈的链式存储表示

1栈的链式表示

栈的链式存储结构称为链栈,是运算受限的单链表。其插入和删除操作只能在表头位置上进行。因此,链栈没有必要像单链表那样附加头结点,栈顶指针top就是链表的头指针。图3-4是栈的链式存储表示形式。

图3-4 链栈存储形式

链栈的结点类型说明如下:

2链栈基本操作的实现

栈的初始化

压栈(元素进栈)

弹栈(元素出栈)