第四章栈与队列课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第四章栈与队列课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四 队列 课件
- 资源描述:
-
1、第四章 栈和队列一一、教学内容:、教学内容:1 1、栈和队列的定义及特点;、栈和队列的定义及特点;2 2、栈的顺序存储表示和链接存储表示及操作;、栈的顺序存储表示和链接存储表示及操作;3 3、队列的顺序存储表示及操作;队列的链接存、队列的顺序存储表示及操作;队列的链接存储表示及操作;储表示及操作;4 4、栈和队列的应用举例、栈和队列的应用举例。二、教学要求:二、教学要求:1、掌握栈和队列的定义、特性,并能正确应用它们解决实、掌握栈和队列的定义、特性,并能正确应用它们解决实 际问题;际问题;2、熟练掌握栈的顺序表示、链表表示以及相应操作的实、熟练掌握栈的顺序表示、链表表示以及相应操作的实 现。特
2、别注意栈空和栈满的条件;现。特别注意栈空和栈满的条件;3、熟练掌握队列的顺序表示、链表表示以及相应操作的实、熟练掌握队列的顺序表示、链表表示以及相应操作的实 现。特别是循环队列中队头与队尾指针的变化情况。现。特别是循环队列中队头与队尾指针的变化情况。栈和队列是两种特殊的线性表,是的线性表,称限定性数据结构。内容如下:队列的应用队列的应用4.1 栈(栈(stack)一、一、栈的定义:限定仅在表的一端进行插入和删栈的定义:限定仅在表的一端进行插入和删除操作的线性表,允许进行插入和删除的一端称除操作的线性表,允许进行插入和删除的一端称为为栈顶栈顶,另一端称为,另一端称为栈底栈底,不含元素的空表称空,
3、不含元素的空表称空栈。栈。特点:先进后出(特点:先进后出(FILO)或后进先出()或后进先出(LIFO)ana1a2.栈底栈顶.出栈进栈栈s=(a1,a2,an)栈的特点栈的特点根据栈的定义可知,最先放入栈中元素在栈根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放好相反,最后放入的元素最先删除,最先放入的元素最后删除。入的元素最后删除。也就是说,栈是一种后进先出也就是说,栈是一种后进先出(Last In First Out)的线性表,简称为的线性表,简称为LIFO表。表。栈的基本操作栈的基本
4、操作1.初始化栈:初始化栈:INISTACK(&S)将栈S置为一个空栈(不含任何元素)。2.进栈:进栈:PUSH(&S,X)将元素X插入到栈S中,也称为“入栈”、“插入”、“压入”。3.出栈:出栈:POP(&S)删除栈S中的栈顶元素,也称为”退栈”、“删除”、“弹出”。4.取栈顶元素:取栈顶元素:GETTOP(S,&e)取栈S中栈顶元素。5.判栈空:判栈空:StackEmpty(S)判断栈S是否为空,若为空,返回值为true,否则返回值为false。例例1:对于一个栈,给出输入项对于一个栈,给出输入项A、B、C,如果输入项序列,如果输入项序列由由ABC组成,试给出所有可能的输出序列。组成,试给
5、出所有可能的输出序列。A进进 A出出 B进进 B出出 C进进 C出出 ABCA进进 A出出 B进进 C进进 C出出 B出出 ACBA进进 B进进 B出出 A出出 C进进 C出出 BACA进进 B进进 B出出 C进进 C出出 A出出 BCAA进进 B进进 C进进 C出出 B出出 A出出 CBA不可能产生输出序列不可能产生输出序列CAB例例2:一个栈的输入序列是一个栈的输入序列是12345,若在入栈的过程中,若在入栈的过程中允许出栈允许出栈,则栈的输出序列则栈的输出序列43512可能实现吗?可能实现吗?12345的输出呢?的输出呢?43512不可能实现,主要是其中的不可能实现,主要是其中的12顺序
6、不能实顺序不能实现;现;12345的输出可以实现,只需压入一个立即弹出的输出可以实现,只需压入一个立即弹出一个即可。一个即可。435612中到了中到了12顺序不能实现;顺序不能实现;135426可以实现。可以实现。例例3:如果一个栈的输入序列为如果一个栈的输入序列为123456,能否得到,能否得到435612和和135426的出栈序列?的出栈序列?答:答:答:答:例例4:设依次进入一个栈的元素序列为设依次进入一个栈的元素序列为c,a,b,d,则可得到出栈的元素序列是:则可得到出栈的元素序列是:A、D可以(可以(B、C不行)。不行)。答:答:二、二、顺序栈顺序栈 由于栈是操作受限的线性表,因此线
7、性表的由于栈是操作受限的线性表,因此线性表的存储结构对栈也适应。存储结构对栈也适应。栈的顺序存储结构简称为顺序栈,因此,可栈的顺序存储结构简称为顺序栈,因此,可用数组来实现顺序栈。因为栈底位置是固定不变用数组来实现顺序栈。因为栈底位置是固定不变的,所以可以将栈底位置设置在数组的两端的任的,所以可以将栈底位置设置在数组的两端的任何一个端点;栈顶位置是随着进栈和退栈操作而何一个端点;栈顶位置是随着进栈和退栈操作而变化的,故需用一个整型变量变化的,故需用一个整型变量top来指示当前栈顶来指示当前栈顶的位置,通常称的位置,通常称top为栈顶指针。为栈顶指针。因此,顺序栈的类型定义只需将顺序表的因此,顺
8、序栈的类型定义只需将顺序表的类型定义中的长度属性改为类型定义中的长度属性改为top即可。顺序即可。顺序栈的类型定义如下:栈的类型定义如下:#define N 10 typedef struct ElemType dataN;int top;SeqStack;或或 typedef struct seqlist ElemType *elem;int top;seqstack;top=-1123450栈空栈空栈顶指针top,指向实际栈顶,初值为-1top123450进栈进栈Atop出栈出栈栈满栈满BCDEF设数组维数为设数组维数为Mtop=-1,栈空,此时出栈,则下溢(栈空,此时出栈,则下溢(und
9、erflow)top=M-1,栈满,此时入栈,则上溢(栈满,此时入栈,则上溢(overflow)toptoptoptoptop123450ABCDEFtoptoptoptoptoptop栈空栈空栈顶栈顶top 的值为栈顶元素下标,的值为栈顶元素下标,top为为-1表示空栈。表示空栈。设设S是是SeqStack类型的指针变量。即类型的指针变量。即 sdata0是栈底元素,那么栈顶指针是栈底元素,那么栈顶指针stop是是正向增加的,即进栈时需将正向增加的,即进栈时需将stop加加1,退栈时,退栈时需将需将stop 减减1。stop=-1表示空栈表示空栈(下溢下溢),stop=N-1表示栈满。当栈满
10、时(上溢)不能再做进栈运算表示栈满。当栈满时(上溢)不能再做进栈运算;当栈空时不能再做退栈运算,此时当栈空时不能再做退栈运算,此时s-top=-1。下溢常常用来作为程序控制转移的条件。下溢常常用来作为程序控制转移的条件。1 1、初始化空栈、初始化空栈 sqstack*initstack()/创建一个空栈创建一个空栈 sqstack*s;s=(sqstack*)malloc(sizeof(sqstack);s-top=-1;return s;或void init(seqstack&l)/初始化 l.elem=new intN;l.top=-1;2 2、判断栈空、判断栈空 int sempty(s
11、eqstack*l)if(l-top=-1)return 0;else return 1;或void emptys(seqstack&s)if(s.top top=N-1)printf(“overflow!”);return;top+;s-datatop=item;或int push(seqstack&s,int x)/将x入栈if(s.top=N-1)return(0);s.top+;s.elems.top=x;return 1;4 4、退栈、退栈 void pop(seqstack*l)/出栈出栈 if(l-top=-1)printf(dont delete!“);return;else
12、l-top-;或或int pop(seqstack&s)/出栈出栈 if(s.toptop!=-1)return(s-datas.top);else exit(1);或或void gettop(seqstack&s,int&m)/取栈顶元素取栈顶元素 if(s.top=0)m=s.elems.top;栈的共享存储单元栈的共享存储单元 有时,一个程序设计中,需要使用多个同一类型有时,一个程序设计中,需要使用多个同一类型的栈的栈,这时候,可能会产生一个栈空间过小,容量发这时候,可能会产生一个栈空间过小,容量发生溢出,而另一个栈空间过大,造成大量存储单元生溢出,而另一个栈空间过大,造成大量存储单元浪
13、费的现象。浪费的现象。为了充分利用各个栈的存储空间,这为了充分利用各个栈的存储空间,这时可以采用多个栈共享存储单元,即给多个栈分配时可以采用多个栈共享存储单元,即给多个栈分配一个足够大的存储空间,让多个栈实现存储空间优一个足够大的存储空间,让多个栈实现存储空间优势互补。势互补。栈1 顶 栈2 顶 栈1 底 栈2 底 图 两个栈共享存储单元示意图 三三 链栈链栈 栈的链式存储结构称为链栈,是插入和删栈的链式存储结构称为链栈,是插入和删除操作仅限制在表头位置上进行的单链。除操作仅限制在表头位置上进行的单链。由于只能在链表头部进行操作,栈顶指针由于只能在链表头部进行操作,栈顶指针就是链表的头指针。就
14、是链表的头指针。链栈的结点定义链栈的结点定义:typedef struct stacknode ElemType data;struct node *next;LinkStack,s1;栈的链接存储结构栈的链接存储结构 链式栈 链式栈无栈满问题,空间可扩充 插入与删除仅在栈顶处进行 链式栈的栈顶在链头 适合于多栈操作 链栈的出栈算法:链栈的出栈算法:即是删除链表中的第一个元素即是删除链表中的第一个元素 链栈的入栈算法:链栈的入栈算法:即是在单链表中第一个元素的位置即是在单链表中第一个元素的位置 上添加一个元素。上添加一个元素。其他算法同单链表中相应算法。其他算法同单链表中相应算法。链栈的进栈算
15、法链栈的进栈算法struct stacknode*pushlstack(struct stacknode*t,int x)/入栈(入栈(x加入到加入到t作头指针的链栈中作头指针的链栈中)struct stacknode*node;if(node=(struct stacknode*)malloc(sizeof(s1)!=NULL)node-next=t;t=node;t-data=x;return(t);建立空链栈:建立空链栈:struct stacknode*top=NULL;/初始化空栈初始化空栈,不带头结点不带头结点从空栈始,依次调用进栈算法建立含有若干个元素的从空栈始,依次调用进栈算法
16、建立含有若干个元素的非空栈。非空栈。4.2 栈的应用举例栈的应用举例 栈结构具有的后进先出特性,致使栈成为程序栈结构具有的后进先出特性,致使栈成为程序设计中常用的工具。设计中常用的工具。一、栈的应用举例一、栈的应用举例-数制转换数制转换 十进制十进制N和其它进制数的转换是计算机实现计和其它进制数的转换是计算机实现计算的基本问题算的基本问题,其解决方法很多其解决方法很多,其中一个简单算其中一个简单算法基于下列原理法基于下列原理:N=(n div d)*d+n mod d (其中其中:div为整除运算为整除运算,mod为求余运算为求余运算)例如例如(1348)10=(2504)8,其运算过程如下:
17、其运算过程如下:n n div 8 n mod 8 1348 168 4 168 21 0 21 2 5 2 0 2二、栈的应用举例文字编辑器二、栈的应用举例文字编辑器seqstack s;EDIT()char c;SETNULL(&s);cgetchar();while(c!=*)if(c=#)POP(&s);else if(c=)SETNULL(&s);else PUSH(&s,c);cgetchar();表达式求值的算法是表达式求值的算法是 “算符优先法算符优先法”。例如:例如:3*(7 2)(1)要正确求值,首先了解算术四则运算的规则:)要正确求值,首先了解算术四则运算的规则:a.从左
18、算到右从左算到右 b.先乘除,后加减先乘除,后加减 c.先括号内,后括号外先括号内,后括号外 由此,此表达式的计算顺序为:由此,此表达式的计算顺序为:3*(7 2)=3*5=15三、栈的应用举例表达式计算三、栈的应用举例表达式计算(2)根据上述三条运算规则,在运算的每一步)根据上述三条运算规则,在运算的每一步中,对任意相继出现的算符中,对任意相继出现的算符 1和和 2,都要比较,都要比较优先权关系。优先权关系。算符优先法所依据的算符间的优先关系算符优先法所依据的算符间的优先关系见教材见教材P53表表3.1 (是提供给计算机用的表!)(是提供给计算机用的表!)(3)算法思想:)算法思想:设定两栈
19、:设定两栈:操作符栈操作符栈 OPTR,操作数栈,操作数栈 OPND 栈初始化栈初始化:设操作数栈:设操作数栈 OPND 为空;操作符栈为空;操作符栈 OPTR 的栈底的栈底元素为表达式起始符元素为表达式起始符#;依次读入字符:依次读入字符:是操作数则入是操作数则入OPND栈,是操作符则要判断:栈,是操作符则要判断:if 操作符操作符 栈顶元素栈顶元素,压入,压入OPTR栈。栈。OPTROPNDINPUTOPERATE3*(7-2)#Push(opnd,3)#*(7-2)#3#Push(optr,*)#,*3(7-2)#Push(optr,()#,*,(37-2)#Push(opnd,7)#,
20、*,(3,7-2)#Push(optr,-)#,*,(,3,72)#Push(opnd,2)#,*,(,3,7,2)#Operate(7-2)#,*,(3,5)#Pop(optr)#,*3,5#Operate(3*5)#15#GetTop(opnd)背包问题求解:背包的体积为背包的体积为T,有有n件物品,其体积分别为件物品,其体积分别为Wi,i=1,2,n.从从中找出若干件刚好装满背包,则此为一组解。中找出若干件刚好装满背包,则此为一组解。方法:回溯法方法:回溯法 用栈解决用栈解决 void knap(int w,int T,int n)int k=0;do for(;T0&k=0)Push(
21、sp,k);T-=wk;if(T=0)print(sp);Pop(sp,k);T+=wk;+k;while(sp.top!=-1)|(k1 时时,则则x y zx y znn 1Void Hanoi (int n,char x,char y,char z )/将将 n 个个 编号从上到下为编号从上到下为 1n 的盘子从的盘子从 x 柱,借助柱,借助 y 柱柱 /移到移到 z 柱柱 if(n =1 )move(x,1,z );/将编号为将编号为 1 的盘子从的盘子从 x 柱移到柱移到 z 柱柱 else /将将 n-1个个 编号从上到下为编号从上到下为1n-1的盘子从的盘子从 x 柱,借助柱,借
22、助 /y 柱移到柱移到 z 柱柱 Hanoi(n-1,x,z ,y );move(x,n,z);/将编号为将编号为 n 的盘子从的盘子从 x 柱移到柱移到 z 柱柱 /将将 n-1个个 编号从上到下为编号从上到下为 1n-1的盘子从的盘子从 y 柱,借助柱,借助 x /柱移到柱移到 z 柱柱 Hanoi(n-1,y,x,z);/Hanoi4.3 4.3 队列队列4.3.1 4.3.1 队列的定义队列的定义 也是一种运算受限的线性表。它也是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为除。允许删除的一端称为,允许
展开阅读全文