数据结构清华大学严蔚敏ppt栈和队列课件.ppt
《数据结构清华大学严蔚敏ppt栈和队列课件.ppt》由会员分享,可在线阅读,更多相关《数据结构清华大学严蔚敏ppt栈和队列课件.ppt(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第3章章 栈和队列栈和队列 栈和队列是两种应用非常广泛的数据结构栈和队列是两种应用非常广泛的数据结构栈和队列是两种应用非常广泛的数据结构栈和队列是两种应用非常广泛的数据结构,它们都,它们都,它们都,它们都来自线性表数据结构,来自线性表数据结构,来自线性表数据结构,来自线性表数据结构,都是都是都是都是“操作受限操作受限操作受限操作受限”的线性表的线性表的线性表的线性表。栈在计算机的实现有多种方式:栈在计算机的实现有多种方式:栈在计算机的实现有多种方式:栈在计算机的实现有多种方式:硬堆栈硬堆栈硬堆栈硬堆栈:利用:利用:利用:利用CPUCPU中的某些寄存器组或类似的硬中的某些寄存器组或类似的硬中的
2、某些寄存器组或类似的硬中的某些寄存器组或类似的硬件或使用内存的特殊区域来实现。这类堆栈容量有限,件或使用内存的特殊区域来实现。这类堆栈容量有限,件或使用内存的特殊区域来实现。这类堆栈容量有限,件或使用内存的特殊区域来实现。这类堆栈容量有限,但速度很快;但速度很快;但速度很快;但速度很快;软堆栈软堆栈软堆栈软堆栈:这类堆栈主要在内存中实现。堆栈容量:这类堆栈主要在内存中实现。堆栈容量:这类堆栈主要在内存中实现。堆栈容量:这类堆栈主要在内存中实现。堆栈容量可以达到很大。在实现方式上,又有可以达到很大。在实现方式上,又有可以达到很大。在实现方式上,又有可以达到很大。在实现方式上,又有动态方式动态方式
3、动态方式动态方式和和和和静态静态静态静态方式方式方式方式两种。两种。两种。两种。本章将讨论栈和队列的基本概念本章将讨论栈和队列的基本概念本章将讨论栈和队列的基本概念本章将讨论栈和队列的基本概念、存储结构存储结构存储结构存储结构、基本基本基本基本操作以及这些操作的具体实现操作以及这些操作的具体实现操作以及这些操作的具体实现操作以及这些操作的具体实现。3.1 栈栈3.1.1 栈的基本概念栈的基本概念1 栈的概念栈的概念 栈栈(Stack):是限制在表的一端进行插入和删除是限制在表的一端进行插入和删除是限制在表的一端进行插入和删除是限制在表的一端进行插入和删除操作的线性表。又称为后进先出操作的线性表
4、。又称为后进先出操作的线性表。又称为后进先出操作的线性表。又称为后进先出LIFOLIFO (Last In Last In First OutFirst Out)或先进后出或先进后出或先进后出或先进后出FILOFILO (First In Last OutFirst In Last Out)线性线性线性线性表。表。表。表。栈顶栈顶(Top):允许进行插入、删除操作的一端,允许进行插入、删除操作的一端,允许进行插入、删除操作的一端,允许进行插入、删除操作的一端,又称为表尾。用栈顶指针又称为表尾。用栈顶指针又称为表尾。用栈顶指针又称为表尾。用栈顶指针(top)(top)来指示栈顶元素来指示栈顶元素
5、来指示栈顶元素来指示栈顶元素。栈底栈底(Bottom):是固定端,又称为表头。是固定端,又称为表头。是固定端,又称为表头。是固定端,又称为表头。空栈空栈:当表中没有元素时称为空栈。当表中没有元素时称为空栈。当表中没有元素时称为空栈。当表中没有元素时称为空栈。设栈设栈设栈设栈S=(aS=(a1 1,a a2 2,a an n),则,则,则,则a a1 1称为栈底元素,称为栈底元素,称为栈底元素,称为栈底元素,a an n为栈顶元素,如为栈顶元素,如为栈顶元素,如为栈顶元素,如图图图图3-13-1所示。所示。所示。所示。栈中元素按栈中元素按栈中元素按栈中元素按a a1 1,a a2 2,a an
6、n的次的次的次的次序进栈,退栈的第一个元素应为栈顶序进栈,退栈的第一个元素应为栈顶序进栈,退栈的第一个元素应为栈顶序进栈,退栈的第一个元素应为栈顶元素。即栈的修改是按后进先出的原元素。即栈的修改是按后进先出的原元素。即栈的修改是按后进先出的原元素。即栈的修改是按后进先出的原则进行的。则进行的。则进行的。则进行的。图图3-1 顺序顺序栈示意图栈示意图a1a2aianbottomtop进栈(进栈(push)出栈出栈(pop)2 栈的抽象数据类型定义栈的抽象数据类型定义ADT Stack数据对象:数据对象:D=ai|aiElemSet,i=1,2,n,n0 数据关系:数据关系:R=|ai-1,aiD
7、,i=2,3,n 基本操作:初始化、进栈、出栈、取栈顶元素等基本操作:初始化、进栈、出栈、取栈顶元素等 ADT Stack 栈的顺序存储结构简称为顺序栈,和线性表相类似,栈的顺序存储结构简称为顺序栈,和线性表相类似,栈的顺序存储结构简称为顺序栈,和线性表相类似,栈的顺序存储结构简称为顺序栈,和线性表相类似,用用用用一维数组一维数组一维数组一维数组来来来来存储栈存储栈存储栈存储栈。根据数组是否可以根据需要增大,。根据数组是否可以根据需要增大,。根据数组是否可以根据需要增大,。根据数组是否可以根据需要增大,又可分为又可分为又可分为又可分为静态顺序栈静态顺序栈静态顺序栈静态顺序栈和和和和动态顺序栈动
8、态顺序栈动态顺序栈动态顺序栈。静态顺序栈静态顺序栈静态顺序栈静态顺序栈实现简单,但不能根据需要增大栈的实现简单,但不能根据需要增大栈的实现简单,但不能根据需要增大栈的实现简单,但不能根据需要增大栈的存储空间;存储空间;存储空间;存储空间;动态顺序栈动态顺序栈动态顺序栈动态顺序栈可以根据需要增大栈的存储空间,但可以根据需要增大栈的存储空间,但可以根据需要增大栈的存储空间,但可以根据需要增大栈的存储空间,但实现稍为复杂。实现稍为复杂。实现稍为复杂。实现稍为复杂。3.1.2 栈的顺序存储表示栈的顺序存储表示 采用采用采用采用动态动态动态动态一维数组一维数组一维数组一维数组来来来来存储栈存储栈存储栈存
9、储栈。所谓动态,指的是栈。所谓动态,指的是栈。所谓动态,指的是栈。所谓动态,指的是栈的大小可以根据需要增加。的大小可以根据需要增加。的大小可以根据需要增加。的大小可以根据需要增加。用用用用bottombottom表示栈底指针,栈底固定不变的;栈表示栈底指针,栈底固定不变的;栈表示栈底指针,栈底固定不变的;栈表示栈底指针,栈底固定不变的;栈顶则随着进栈和退栈操作而变化。用顶则随着进栈和退栈操作而变化。用顶则随着进栈和退栈操作而变化。用顶则随着进栈和退栈操作而变化。用toptop(称为栈顶称为栈顶称为栈顶称为栈顶指针指针指针指针)指示当前栈顶位置。指示当前栈顶位置。指示当前栈顶位置。指示当前栈顶位
10、置。用用用用top=bottomtop=bottom作为栈空的标记作为栈空的标记作为栈空的标记作为栈空的标记,每次,每次,每次,每次toptop指向指向指向指向栈顶数组中的下一个存储位置栈顶数组中的下一个存储位置栈顶数组中的下一个存储位置栈顶数组中的下一个存储位置。结点进栈结点进栈:首先将数据元素保存到栈顶首先将数据元素保存到栈顶首先将数据元素保存到栈顶首先将数据元素保存到栈顶(toptop所所所所指的当前位置指的当前位置指的当前位置指的当前位置),然后执行,然后执行,然后执行,然后执行toptop加加加加1 1,使,使,使,使toptop指向栈顶指向栈顶指向栈顶指向栈顶的下一个存储位置的下一
11、个存储位置的下一个存储位置的下一个存储位置;3.1.2.1 栈的动态顺序存储表示栈的动态顺序存储表示 结点出栈结点出栈:首先执行首先执行首先执行首先执行toptop减减减减1 1,使,使,使,使toptop指向栈顶指向栈顶指向栈顶指向栈顶元素的存储位置,然后将栈顶元素取出元素的存储位置,然后将栈顶元素取出元素的存储位置,然后将栈顶元素取出元素的存储位置,然后将栈顶元素取出。图图图图3-23-2是一个动态栈的变化示意图是一个动态栈的变化示意图是一个动态栈的变化示意图是一个动态栈的变化示意图。图图3-2 (动态动态)堆栈变化示意图堆栈变化示意图空栈空栈bottomtop元素元素a进栈进栈botto
12、mtopa元素元素b,c进栈进栈bottomtopabc元素元素c退栈退栈bottomtopabbottomtopabdef元素元素d,e,f进栈进栈基本操作的实现基本操作的实现1 栈的类型定义栈的类型定义#define STACK_SIZE 100#define STACK_SIZE 100 /*/*栈初始向量大小栈初始向量大小栈初始向量大小栈初始向量大小 */#define STACKINCREMENT 10#define STACKINCREMENT 10 /*/*存储空间分存储空间分存储空间分存储空间分配增量配增量配增量配增量 */#typedef int ElemType;#type
13、def int ElemType;typedef struct sqstacktypedef struct sqstack ElemType *bottom;ElemType *bottom;/*/*栈不存在时值为栈不存在时值为栈不存在时值为栈不存在时值为NULL */NULL */ElemType *top;ElemType *top;/*/*栈顶指针栈顶指针栈顶指针栈顶指针 */int stacksize;int stacksize;/*/*当前已分配空间,以元素当前已分配空间,以元素当前已分配空间,以元素当前已分配空间,以元素为单位为单位为单位为单位 */SqStack;SqStack;
14、2 栈的初始化栈的初始化Status Init_Stack(void)Status Init_Stack(void)SqStack S;SqStack S;S.bottom=(ElemType S.bottom=(ElemType*)malloc(STACK_SIZE*)malloc(STACK_SIZE*sizeof(ElemType);*sizeof(ElemType);if(!S.bottom)return ERROR;if(!S.bottom)return ERROR;S.top=S.bottom;S.top=S.bottom;/*/*栈空时栈顶和栈底指针相栈空时栈顶和栈底指针相栈空时
15、栈顶和栈底指针相栈空时栈顶和栈底指针相同同同同 */S.stacksize=STACK_SIZE;S.stacksize=STACK_SIZE;return OK;return OK;3 压栈压栈(元素进栈元素进栈)Status push(SqStack S,ElemType e)Status push(SqStack S,ElemType e)if (S.top-S.bottom=S.stacksize-1)S.bottom=(ElemType*)realloc(S.S.bottom=(ElemType*)realloc(S.STACKINCREMENT+STACK_SIZE)STACKIN
16、CREMENT+STACK_SIZE)*sizeof(ElemType);*sizeof(ElemType);/*/*栈满,追加存储空栈满,追加存储空栈满,追加存储空栈满,追加存储空间间间间 */if(!S.bottom)return ERROR;if(!S.bottom)return ERROR;S.top=S.bottom+S.stacksize;S.top=S.bottom+S.stacksize;S.stacksize+=STACKINCREMENT;S.stacksize+=STACKINCREMENT;*S.top=e;S.top+;*S.top=e;S.top+;/*/*/*/*
17、栈顶指针加栈顶指针加栈顶指针加栈顶指针加1 1,e e成为新的成为新的成为新的成为新的栈顶栈顶栈顶栈顶*/return OK;return OK;4 弹栈弹栈(元素元素出栈出栈)Status pop(SqStack S,ElemType *e)Status pop(SqStack S,ElemType *e)/*/*弹出栈顶元素弹出栈顶元素弹出栈顶元素弹出栈顶元素*/if(S.top=S.bottom)if(S.top=S.bottom)return ERROR;return ERROR;/*/*栈空,返回失败标志栈空,返回失败标志栈空,返回失败标志栈空,返回失败标志 */S.top-;e=*
18、S.top;S.top-;e=*S.top;return OK;return OK;采用采用采用采用静态静态静态静态一维数组一维数组一维数组一维数组来来来来存储栈存储栈存储栈存储栈。栈底固定不变的,而栈顶则随着进栈和退栈操作变栈底固定不变的,而栈顶则随着进栈和退栈操作变栈底固定不变的,而栈顶则随着进栈和退栈操作变栈底固定不变的,而栈顶则随着进栈和退栈操作变化的,化的,化的,化的,栈底固定不变的;栈顶则随着进栈和退栈操作而栈底固定不变的;栈顶则随着进栈和退栈操作而栈底固定不变的;栈顶则随着进栈和退栈操作而栈底固定不变的;栈顶则随着进栈和退栈操作而变化,用一个整型变量变化,用一个整型变量变化,用一
19、个整型变量变化,用一个整型变量toptop(称为栈顶指针称为栈顶指针称为栈顶指针称为栈顶指针)来指示当来指示当来指示当来指示当前栈顶位置。前栈顶位置。前栈顶位置。前栈顶位置。用用用用top=0top=0表示栈空的初始状态表示栈空的初始状态表示栈空的初始状态表示栈空的初始状态,每次,每次,每次,每次toptop指向栈指向栈指向栈指向栈顶在数组中的存储位置顶在数组中的存储位置顶在数组中的存储位置顶在数组中的存储位置。结点进栈结点进栈:首先执行首先执行首先执行首先执行toptop加加加加1 1,使,使,使,使toptop指向新的指向新的指向新的指向新的栈顶位置栈顶位置栈顶位置栈顶位置,然后将数据元素
20、保存到栈顶然后将数据元素保存到栈顶然后将数据元素保存到栈顶然后将数据元素保存到栈顶(toptop所指的所指的所指的所指的当前位置当前位置当前位置当前位置)。3.1.2.2 栈的静态顺序存储表示栈的静态顺序存储表示 结点出栈结点出栈:首先首先首先首先把把把把toptop指向的栈顶元素取出指向的栈顶元素取出指向的栈顶元素取出指向的栈顶元素取出,然然然然后执行后执行后执行后执行toptop减减减减1 1,使,使,使,使toptop指向新的栈顶位置指向新的栈顶位置指向新的栈顶位置指向新的栈顶位置。若栈的数组有若栈的数组有若栈的数组有若栈的数组有MaxsizeMaxsize个元素个元素个元素个元素,则,
21、则,则,则top=Maxsize-1top=Maxsize-1时栈满时栈满时栈满时栈满。图。图。图。图3-33-3是一个大小为是一个大小为是一个大小为是一个大小为5 5的栈的栈的栈的栈的变化示意图的变化示意图的变化示意图的变化示意图。图图3-3 静态静态堆栈变化示意图堆栈变化示意图空栈空栈bottomtopTop=11个元素进栈个元素进栈bottomtopaTop=33个元素进栈个元素进栈bottomtopabcTop=4栈满栈满bottomtopabedTop=2元素元素c进栈进栈bottomtopab基本操作的实现基本操作的实现1 栈的类型定义栈的类型定义#define MAX_STACK
22、_SIZE 100#define MAX_STACK_SIZE 100 /*/*栈向栈向栈向栈向量大小量大小量大小量大小 */#typedef int ElemType;#typedef int ElemType;typedef struct sqstacktypedef struct sqstack ElemType ElemType stack_arrayMAX_STACK_SIZE;stack_arrayMAX_STACK_SIZE;int top;int top;SqStack;SqStack;2 栈的初始化栈的初始化SqStack Init_Stack(void)SqStack In
23、it_Stack(void)SqStack S;SqStack S;S.bottom=S.top=0;return(S);S.bottom=S.top=0;return(S);3 压栈压栈(元素进栈元素进栈)Status push(SqStack S,ElemType e)Status push(SqStack S,ElemType e)/*/*/*/*使数据元素使数据元素使数据元素使数据元素e e进栈成为新的栈顶进栈成为新的栈顶进栈成为新的栈顶进栈成为新的栈顶 */if (S.top=MAX_STACK_SIZE-1)if (S.top=MAX_STACK_SIZE-1)return ERR
24、OR;return ERROR;/*/*栈满,返回错误标志栈满,返回错误标志栈满,返回错误标志栈满,返回错误标志 */S.top+;S.top+;/*/*/*/*栈顶指针加栈顶指针加栈顶指针加栈顶指针加1 1 */*/*/*/S.stack_arrayS.top=e ;S.stack_arrayS.top=e ;/*/*/*/*e e成为新的栈成为新的栈成为新的栈成为新的栈顶顶顶顶 */return OK;return OK;/*/*压栈成功压栈成功压栈成功压栈成功 */4 弹栈弹栈(元素元素出栈出栈)Status pop(SqStack S,ElemType *e)Status pop(Sq
25、Stack S,ElemType *e)/*/*弹出栈顶元素弹出栈顶元素弹出栈顶元素弹出栈顶元素*/if(S.top=0)if(S.top=0)return ERROR;return ERROR;/*/*栈空,返回错误标志栈空,返回错误标志栈空,返回错误标志栈空,返回错误标志 */*e=S.stack_arrayS.top;*e=S.stack_arrayS.top;S.top-;S.top-;return OK;return OK;当栈满时做进栈运算必定产生空间溢出,简称当栈满时做进栈运算必定产生空间溢出,简称当栈满时做进栈运算必定产生空间溢出,简称当栈满时做进栈运算必定产生空间溢出,简称“
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 清华大学 严蔚敏 ppt 队列 课件
限制150内