数据结构-栈和队列PPT课件_第1页
数据结构-栈和队列PPT课件_第2页
数据结构-栈和队列PPT课件_第3页
数据结构-栈和队列PPT课件_第4页
数据结构-栈和队列PPT课件_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章栈和队列,掌握栈和队列的特点,并能在相应的应用问题中正确选用熟练掌握栈的两种存储结构的基本操作实现算法,特别应注意栈满和栈空的条件熟练掌握循环队列和链队列的基本操作实现算法,特别注意队满和队空的条件理解递归算法执行过程中栈的状态变化过程,栈(Stack)1.定义2.逻辑结构3.存储结构4.运算规则5.实现方式,队列(Queue)1.定义2.逻辑结构3.存储结构4.运算规则5.实现方式,3.1栈,栈是一种特殊的线性表,它只能在表的一端(栈顶)进行插入和删除运算栈与一般线性表的区别:仅在于运算规则不同,栈与一般线性表的区别,“进”压入=PUSH()“出”弹出=POP(),写入:vi=ai读出:x=vi,压入:PUSH(an+1)弹出:POP(x),前提:一定要预设栈顶指针top!,an+1,顺序栈与顺序表,顺序栈的表示,空栈base=top是栈空标志stacksize=4,top指示真正的栈顶元素之上的下标地址,栈满时的处理方法:1、报错,返回操作系统。2、分配更大的空间,作为栈的存储空间,将原栈的内容移入新栈。,#defineMAXSIZE100typedefstructSElemType*base;SElemType*top;intstacksize;SqStack;,顺序栈的表示,构造一个空栈步骤:(1)分配空间并检查空间是否分配失败,若失败则返回错误,顺序栈初始化,s,(2)设置栈底和栈顶指针S.top=S.base;,(3)设置栈大小,StatusInitStack(SqStack,顺序栈初始化,判断顺序栈是否为空,boolStackEmpty(SqStackS)if(S.top=S.base)returntrue;elsereturnfalse;,求顺序栈的长度,intStackLength(SqStackS)returnS.topS.base;,StatusClearStack(SqStackS)if(S.base)S.top=S.base;returnOK;,清空顺序栈,StatusDestroyStack(SqStack,销毁顺序栈,(1)判断是否栈满,若满则出错(2)元素e压入栈顶(3)栈顶指针加1,顺序栈进栈,StatusPush(SqStack,*S.top=e;S.top+;,(1)判断是否栈空,若空则出错(2)获取栈顶元素e(3)栈顶指针减1,顺序栈出栈,StatusPop(SqStack,-S.top;e=*S.top;,判断是否空栈,若空则返回错误否则通过栈顶指针获取栈顶元素,取顺序栈栈顶元素,StatusGetTop(SqStackS,SElemType,e=*(S.top-);?,435612中到了12顺序不能实现;135426可以实现。,1.如果一个栈的输入序列为123456,能否得到435612和135426的出栈序列?,练习,练习,in-in-i+1不确定,2.若已知一个栈的入栈序列是1,2,3,n,其输出序列为p1,p2,p3,pn,若p1=n,则pi为,练习,top不变top=0top+top-,D,3.在一个具有n个单元的顺序栈中,假设以地址高端作为栈底,以top作为栈顶指针,则当作进栈处理时,top的变化为,双栈共享一个栈空间,优点:互相调剂,灵活性强,减少溢出机会,将编号为0和1的两个栈存放于一个数组空间Vm中,栈底分别处于数组的两端。当第0号栈的栈顶指针top0等于-1时该栈为空,当第1号栈的栈顶指针top1等于m时该栈为空。两个栈均从两端向中间增长(如下图所示)。,typedefstructinttop2,bot2;/栈顶和栈底指针SElemType*V;/栈数组intm;/栈最大可容纳元素个数DblStack;,数据结构定义如下,voidDblpush(DblStackstructStackNode*next;StackNode,*LinkStack;LinkStackS;,链栈的初始化,voidInitStack(LinkStack,判断链栈是否为空,StatusStackEmpty(LinkStackS)if(S=NULL)returnTRUE;elsereturnFALSE;,链栈进栈,StatusPush(LinkStack,链栈出栈,StatusPop(LinkStack,取链栈栈顶元素,SElemTypeGetTop(LinkStackS)if(S=NULL)exit(1);elsereturnSdata;,3.2栈的应用,例1:数制转换(十转N)用栈暂存低位值例2:括号匹配的检验用栈暂存左括号例3:表达式求值用栈暂存运算符例4:迷宫求解用栈实现递归调用,简化了程序设计的问题,迷宫求解,从入口出发,按某一方向向未走过的前方探索若能走通,则到达新点,否则试探下一方向;若所有的方向均没有通路,则沿原路返回前一点,换下一个方向再继续试探直到所有可能的通路都探索到,或找到一条通路,或无路可走又返回到入口点。,求解思想:回溯法,迷宫求解,需要解决的问题:1、表示迷宫的数据结构2、试探方向3、栈的设计4、防止重复到达某点,避免发生死循环,迷宫求解,1、表示迷宫的数据结构表示一个m行n列迷宫:用mazemn表示,0i,x,=,x,x,表3.1算符间的优先关系,【算法思想】,(1)初始化OPTR栈和OPND栈,将“#”压入OPTR(2)依次读入字符ch,循环执行(3)至(5)(3)取出OPTR的栈顶元素,当OPTR的栈顶元素和ch均为“#”时,表达式求值完毕,OPND栈顶元素为表达式的值,设定两栈:OPND-操作数或运算结果OPTR-运算符,(4)if(ch是操作数)则ch进OPND,读入下一字符ch,(5)else比较OPTR栈顶元素和ch的优先级,case:运算符ch进OPTR,读入下一字符ch,case=:脱括号(弹出左括号),读入下一字符ch,case:栈顶运算符退栈、计算,结果进OPND,OperandTypeEvaluateExpression()InitStack(OPND);ch=getchar();while(ch!=#|GetTop(OPTR)!=#)if(!In(ch,OP)Push(OPND,ch);ch=getchar();/ch不是运算符则进栈elseswitch(Precede(GetTop(OPTR),ch)/比较优先权case:/弹出OPTR栈顶的运算符运算,并将运算结果入栈Pop(OPTR,theta);Pop(OPND,b);Pop(OPND,a);Push(OPND,Operate(a,theta,b);break;case=:/脱括号并接收下一字符Pop(OPTR,x);ch=getchar();break;/switch/whilereturnGetTop(OPND);/EvaluateExpression,3.3栈与递归,递归的定义若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的;若一个过程直接地或间接地调用自己,则称这个过程是递归的过程。,栈,以下三种情况常常用到递归方法递归定义的数学函数具有递归特性的数据结构可递归求解的问题,1.递归定义的数学函数:,阶乘函数:,2阶Fibonaci数列:,树,2.具有递归特性的数据结构:,Root,Lchild,Rchild,广义表,A=(a,A),3.可递归求解的问题:,迷宫问题Hanoi塔问题,分治法:对于一个较为复杂的问题,能够分解成几个相对简单的且解法相同或类似的子问题来求解,1、能将一个问题转变成一个新问题,而新问题与原问题的解法相同或类同,不同的仅是处理的对象,且这些处理对象是变化有规律的2、可以通过上述转化而使问题简化3、必须有一个明确的递归出口,或称递归的边界,用分治法求解递归问题,必备的三个条件,分治法求解递归问题算法的一般形式:voidp(参数表)if(递归结束条件)可直接求解步骤;-基本项elsep(较小的参数);-归纳项,longFact(longn)if(n=0)return1;/基本项elsereturnn*Fact(n-1);/归纳项,返回2参数2计算2*Fact(1),返回1参数1计算1*Fact(0),返回1参数0直接定值=1,if(n=0)return1;elsereturnn*Fact(n-1);,求解阶乘n!的过程,主程序main:Fact(4),返回6参数3计算3*Fact(2),设有一个递归算法如下:intX(intn)if(n=3)return1;elsereturnX(n-2)+X(n-4)+1则计算X(X(8)时需要计算X函数次.,D,练习,A.8B.9C.16D.18,在印度圣庙里,一块黄铜板上插着三根宝石针。主神梵天在创造世界时,在其中一根针上穿好了由大到小的64片金片,这就是汉诺塔。僧侣不停移动这些金片,一次只移动一片,小片必在大片上面。当所有的金片都移到另外一个针上时,世界将会灭亡。,汉诺塔,规则:,(1)每次只能移动一个圆盘,(2)圆盘可以插在A,B和C中的任一塔座上,(3)任何时刻不可将较大圆盘压在较小圆盘之上,Hanoi塔问题,Hanoi塔问题,n=1,则直接从A移到C。否则,(1)用C柱做过渡,将A的(n-1)个移到B(2)将A最后一个直接移到C(3)用A做过渡,将B的(n-1)个移到C,#includeintc=0;voidmove(charx,intn,charz)cout+c,n,x,zendl;voidHanoi(intn,charA,charB,charC)if(n=1)move(A,1,C);elseHanoi(n-1,A,C,B);move(A,n,C);Hanoi(n-1,B,A,C);voidmain()Hanoi(3,a,b,c);,跟踪程序,给出下列程序的运行结果,以深刻地理解递归的调用和返回过程,3,a,b,c,递归调用树,函数调用过程,“层次”,“递归工作栈”,“工作记录”,实在参数,局部变量,返回地址,递归函数调用的实现,空间效率,时间效率,O(2n),与递归树的结点数成正比,与递归树的深度成正比,O(n),递归算法的效率分析,1234f(1)=1f(1)+1+f(1)=3f(2)+1+f(2)=7f(3)+1+f(3)=15,f(n)=2f(n-1)+1f(n-1)=2f(n-2)+1f(n-2)=2f(n-3)+1.f(3)=2f(2)+1f(2)=2f(1)+1,20f(n)=21f(n-1)+2021f(n-1)=22f(n-2)+2122f(n-2)=23f(n-3)+22.2n-3f(3)=2n-2f(2)+2n-32n-2f(2)=2n-1f(1)+2n-2,f(n)=20+21+2n-2+2n-1f(1)=2n-1,递归算法的效率分析,64片金片移动次数:264-1=18446744073709551615,假如每秒钟一次,共需多长时间呢?一年大约有31536926秒,移完这些金片需要多亿年世界、梵塔、庙宇和众生都已经灰飞烟灭,!,优点:结构清晰,程序易读缺点:每次调用要生成工作记录,保存状态信息,入栈;返回时要出栈,恢复状态信息。时间开销大。,递归的优缺点,递归非递归,3.4队列,队列是一种先进先出(FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素,a1,a2,a3,an,.,入队列,队头,队尾,a1,a2,a3,an,.,队头,队尾,出队列,a1,a2,a3,an,.,队尾,出队列,a1,a2,a3,an,.,队尾,出队列,设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次通过S,一个元素出栈后即进入Q,若6个元素出队的序列是e2、e4、e3、e6、e5和e1,则栈S的容量至少应该是()。,(A)2(B)3(C)4(D)6,练习,B,数据对象:,数据关系:,基本操作:,(1)InitQueue(/初始化的动态分配存储空间intfront;/头指针intrear;/尾指针SqQueue;,队列的顺序表示用一维数组baseM,队列的顺序表示用一维数组baseM,front=rear=0,空队标志:front=rear入队:baserear+=x;出队:x=basefront+;,存在的问题,设数组大小为M,front=0rear=M时再入队真溢出,front0rear=M时再入队假溢出,解决的方法循环队列,base0接在baseM-1之后若rear+1=M则令rear=0;,实现:利用“模”运算入队:baserear=x;rear=(rear+1)%M;出队:x=basefront;front=(front+1)%M;,队空:front=rear队满:front=rear,解决方案:1.另外设一个标志以区别队空、队满2.少用一个元素空间:队空:front=rear队满:(rear+1)%M=front,rear,front,循环队列,#defineMAXQSIZE100/最大队列长度TypedefstructQElemType*base;/初始化的动态分配存储空间intfront;/头指针intrear;/尾指针SqQueue;,StatusInitQueue(SqQueue,循环队列初始化,求循环队列的长度,intQueueLength(SqQueueQ)return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;,StatusEnQueue(SqQueue,循环队列入队,StatusDeQueue(LinkQueue,循环队列出队,链队列,typedefstructQNodeQElemTypedata;structQnode*next;Qnode,*QueuePtr;typedefstructQueuePtrfront;/队头指针QueuePtrrear;/队尾指针LinkQueue;,链队列,(a)空队列,(b)元素x入队列,(d)元素x出队列,(c)元素y入队列,链队列,StatusInitQueue(LinkQueue,链队列初始化,StatusDestroyQueue(LinkQueue,销毁链队列,StatusQueueEmpty(LinkQueueQ)return(Q.front=Q.rear);,判断链队列是否为空,StatusGetHead(LinkQueueQ,QElemType,求链队列的队头元素,StatusEnQueue(LinkQueue,链队列入队,p,StatusDeQueue(LinkQueue,链队列出队,p,【例】汽车加油站随着城市里汽车数量的急速增长,汽车加油站也渐渐多了起来。通常汽车加油站的结构基本上是:入口和出口为单行道,加油车道可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论