数据结构第3章-栈和队列课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构第3章-栈和队列课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 队列 课件
- 资源描述:
-
1、 第三章第三章 栈和队列栈和队列主要内容主要内容v栈的概念、存储结构及其基本操作栈的概念、存储结构及其基本操作v栈的应用栈的应用v队列的概念、存储结构及其基本操作队列的概念、存储结构及其基本操作 3.1 3.1 栈栈栈的定义栈的定义v栈作为一种限定性线性表,是将线性表的插入和栈作为一种限定性线性表,是将线性表的插入和删除运算限制为仅在表的一端进行。删除运算限制为仅在表的一端进行。v通常将表中允许进行插入、删除操作的一端称为通常将表中允许进行插入、删除操作的一端称为栈顶栈顶(Top)(Top),因此栈顶的当前位置是动态变化的,因此栈顶的当前位置是动态变化的,它由一个称为栈顶指针的位置指示器指示。
2、同时它由一个称为栈顶指针的位置指示器指示。同时表的另一端被称为栈底表的另一端被称为栈底(Bottom)(Bottom)。v当栈中没有元素时称为空栈。当栈中没有元素时称为空栈。v栈的插入操作被形象地称为进栈或入栈,删除操栈的插入操作被形象地称为进栈或入栈,删除操作称为出栈或退栈。作称为出栈或退栈。栈的定义续栈的定义续v假设栈假设栈S=(aS=(a1 1,a a2 2,a a3 3,aan n),则,则a a1 1称为栈底元素,称为栈底元素,a an n为栈顶元素。栈中元素按为栈顶元素。栈中元素按a a1 1,a a2 2,a a3 3,aan n的次的次序进栈,退栈的第一个元素应为栈顶元素。换句
3、序进栈,退栈的第一个元素应为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的。因话说,栈的修改是按后进先出的原则进行的。因此,栈称为后进先出(此,栈称为后进先出(LIFOLIFO)的线性表。)的线性表。a1a2an入栈入栈出栈出栈栈顶栈顶栈底栈底入栈入栈出栈出栈火火车车调调度度栈的定义续栈的定义续v栈的抽象数据类型定义栈的抽象数据类型定义 ADT StackADT Stack 数据对象:数据对象:D=aD=ai i|a|ai i ElemSet,i=1,2,n,n0ElemSet,i=1,2,n,n0,数据关系:数据关系:R R1 1=a ai-1i-1,a,ai i|a|ai-1i-1,
4、a,ai i D,i=2,nD,i=2,n,约定约定a an n端为栈顶,端为栈顶,a a1 1端为栈底。端为栈底。基本操作:基本操作:InitStack(&S)InitStack(&S):将:将S S初始化为空栈。初始化为空栈。DestroyStack(&S)DestroyStack(&S):栈:栈S S被销毁。被销毁。ClearStack(&S)ClearStack(&S):将栈:将栈S S置成空栈。置成空栈。StackEmpty(S)StackEmpty(S):若空栈,则返回真,否则假。:若空栈,则返回真,否则假。StackLength(S)StackLength(S):返回元素个数,即
5、栈的长度。:返回元素个数,即栈的长度。GetTop(S,&e)GetTop(S,&e):用:用e e返回返回S S的栈顶元素。的栈顶元素。Push(&S,e)Push(&S,e):插入元素:插入元素e e为新的栈顶元素。为新的栈顶元素。Pop(&S,&e)Pop(&S,&e):删除:删除S S的栈顶元素,值给的栈顶元素,值给e e。StackTraverse(S,visit()StackTraverse(S,visit():遍历栈。:遍历栈。ADT StackADT Stack栈的顺序存储栈的顺序存储v顺序栈的定义顺序栈的定义v顺序栈是用顺序存储结构实现的栈,即利用一组地址连续顺序栈是用顺序存
6、储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。的存储单元依次存放自栈底到栈顶的数据元素。v栈的顺序存储结构定义栈的顺序存储结构定义#define STACK_INIT_SIZE 100 /存储空间初始分配量存储空间初始分配量#define STACKINCREMENT 10 /存储空间分配增量存储空间分配增量 typedef struct SElemType *base;/栈底指针栈底指针 SElemType *top /栈顶指针栈顶指针 int stacksize;/当前已分配的存储容量当前已分配的存储容量 SqStack;称称basebase为栈底指针,在顺序
7、栈中,它始终指向栈底的位置,为栈底指针,在顺序栈中,它始终指向栈底的位置,若若basebase的值为的值为NULLNULL,则表明栈结构不存在。,则表明栈结构不存在。称称toptop为栈顶指针,其初始值指向栈底,即为栈顶指针,其初始值指向栈底,即top=basetop=base可作为可作为栈空的标记,每当插入新的栈顶元素时,指针栈空的标记,每当插入新的栈顶元素时,指针toptop增增1 1;删除;删除栈顶元素时,指针栈顶元素时,指针toptop减减1 1。因此,非空栈中的栈顶指针始终。因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。在栈顶元素的下一个位置上。basetopbasetopA
8、basetopABCDbasetopABC栈的链式存储栈的链式存储v若是栈中元素的数目变化范围较大或若是栈中元素的数目变化范围较大或不清楚栈元素的数目,就应该考虑使不清楚栈元素的数目,就应该考虑使用用链式存储结构链式存储结构。v将用链式存储结构表示的栈称作将用链式存储结构表示的栈称作“链链栈栈”。链栈通常用一个无头结点的单。链栈通常用一个无头结点的单链表表示。链表表示。v由于栈的插入删除操作只能在一端进由于栈的插入删除操作只能在一端进行,而对于单链表来说,在首端插入行,而对于单链表来说,在首端插入删除结点要比尾端相对地容易一些,删除结点要比尾端相对地容易一些,所以,我们将单链表的首端作为栈顶所
9、以,我们将单链表的首端作为栈顶端,即将单链表的头指针作为栈顶指端,即将单链表的头指针作为栈顶指针。针。topdatanext3.2 3.2 栈的应用举例栈的应用举例1.1.数制转换数制转换【例】十进制数转换成二进制数【例】十进制数转换成二进制数 使用展转相除法将一个十进使用展转相除法将一个十进制数值转换成二进制数值。即用制数值转换成二进制数值。即用该十进制数值除以该十进制数值除以2 2,并保留其余,并保留其余数;重复此操作,直到该十进制数;重复此操作,直到该十进制数值为数值为0 0为止。最后将所有的余数为止。最后将所有的余数反向输出就是所对应的二进制数反向输出就是所对应的二进制数值。值。例如:
10、例如:(692)(692)1010=(1010110100)=(1010110100)2 2 先把余数一味地入栈,完成后进行先把余数一味地入栈,完成后进行一边出栈一边输出即可。一边出栈一边输出即可。2 2 括号匹配检查括号匹配检查v程序中经常用到括号:圆括号程序中经常用到括号:圆括号()(),中括号,中括号 和花括号和花括号 。v正确地使用括号是要配对,其嵌套任意。正确地使用括号是要配对,其嵌套任意。v正确格式如:正确格式如:()()、()()。v不正确格式如:不正确格式如:()()、()()。v可以使用括号栈来完成括号匹配检查。可以使用括号栈来完成括号匹配检查。3 3 行编辑程序行编辑程序v
11、一个简单的行编辑程序的功能是:接受用户从一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。终端输入的程序或数据,并存入用户的数据区。由于用户在终端上进行输入时,不能保证不出由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,差错,因此,若在编辑程序中,“每接受一个每接受一个字符即存入用户数据区字符即存入用户数据区”的做法显然不是最恰的做法显然不是最恰当的。当的。v例如:当用户发现刚刚键入的一个字符是错的例如:当用户发现刚刚键入的一个字符是错的时,可以补进一个时,可以补进一个退格符退格符“#”“#”,以表示前一个,以表示前一个字符无效;如果发现当前
12、输入的行内差错较多字符无效;如果发现当前输入的行内差错较多或难以补救,则可以键入一个或难以补救,则可以键入一个退行符退行符“”“”,以,以表示当前行中的字符均无效。表示当前行中的字符均无效。行编辑程序续行编辑程序续例如:假设从终端接收了如下两行字符:例如:假设从终端接收了如下两行字符:whli#ilr#e(s#whli#ilr#e(s#*s)s)outchaputchar(outchaputchar(*s=#+);s=#+);则实际有效的是下列两行:则实际有效的是下列两行:while(while(*s)s)putchar(putchar(*s+);s+);可设一个存放一行的栈,每当从终端接受了
13、一个字符之可设一个存放一行的栈,每当从终端接受了一个字符之后作如下判别:后作如下判别:如果它既不是如果它既不是退格符退格符也不是也不是退行符退行符,则将该字符压入栈;,则将该字符压入栈;如果是一个退格符,则从栈顶删去一个字符;如果是一个退格符,则从栈顶删去一个字符;如果它是一个退行符,则将字符栈清空。如果它是一个退行符,则将字符栈清空。一行结束,表示行编辑完成。一行结束,表示行编辑完成。4 4 迷宫求解迷宫求解v迷宫求解通常用迷宫求解通常用“穷举求解穷举求解”的方法。的方法。v从入口出发,顺某一方向向前探索,若能走通,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一
14、个方向则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为再继续探索,直至所有可能的通路都探索到为止。止。v为了保证在任何位置上都能沿原路退回,显然为了保证在任何位置上都能沿原路退回,显然需要一个后进先出栈来保存沿路的位置信息。需要一个后进先出栈来保存沿路的位置信息。入口入口出口出口5 5 表达式求值表达式求值v表达式求值是高级语言编译中的一个基本问题,表达式求值是高级语言编译中的一个基本问题,即即“算符优先法算符优先法”,是栈的典型应用实例。,是栈的典型应用实例。v任何一个表达式都是由操作数任何一个表达式都是由操作数(operand)(operand)、运运算符算
15、符(operator)(operator)和界限符和界限符(delimiter)(delimiter)组成的。组成的。v操作数既可以是常数,操作数既可以是常数,也可以是被说明为变量也可以是被说明为变量或常量的标识符;或常量的标识符;v运算符可以分为算术运算符、关系运算符和逻运算符可以分为算术运算符、关系运算符和逻辑运算符三类;辑运算符三类;v基本界限符有左右括号和表达式结束符等。基本界限符有左右括号和表达式结束符等。表达式求值续表达式求值续假设操作数是整型常数,运算符只含加、减、乘、假设操作数是整型常数,运算符只含加、减、乘、除等四种运算符,界限符有左右括号和表达式起始、除等四种运算符,界限符
展开阅读全文