中国计量学院数据结构第3章-栈和队列分析.ppt_第1页
中国计量学院数据结构第3章-栈和队列分析.ppt_第2页
中国计量学院数据结构第3章-栈和队列分析.ppt_第3页
中国计量学院数据结构第3章-栈和队列分析.ppt_第4页
中国计量学院数据结构第3章-栈和队列分析.ppt_第5页
免费预览已结束,剩余60页可下载查看

下载本文档

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

文档简介

3栈和队列,3.1栈(Stack)3.2栈的应用举例3.3队列(Queue),栈和队列是特殊的线性表,其“插入”和“删除”操作只能在表的“端点”进行。,线性表栈队列Insert(L,i,x)Insert(S,n+1,x)Insert(Q,n+1,x)1in+1Delete(L,i)Delete(S,n)Delete(Q,1)1in,栈和队列是两种常用的数据类型,3.1栈,ADTStack数据对象:Dai|aiElemSet,i=1,2,.,n,n0数据关系:R1|ai-1,aiD,i=2,.,n约定an端为栈顶,a1端为栈底。,基本操作:,ADTStack,InitStack(#defineSTACKINCREMENT10;typedefstructSElemType*base;SElemType*top;intstacksize;SqStack;,StatusInitStack(SqStack,StatusPush(SqStack,StatusPop(SqStack,栈顶指针,链栈,a1,an,注意:指针的方向,an-1,3.2栈的应用举例,例一、数制转换,例二、括号匹配的检验,例三、行编辑程序,例四、迷宫求解,例五、表达式求值,如:(1348)10=(2504)8,其运算过程如下:NNdiv8Nmod8134816841682102125202,计算顺序,输出顺序,例一、数制转换,voidconversion()InitStack(S);scanf(%d,例二、括号匹配的检验假设在表达式中()或()等为正确的格式,()或()或())均为不正确的格式。,则检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。,分析可能出现的不匹配的情况:,到来的右括弧并非是所“期待”的;,例如:考虑下列括号序列:()12345678,到来的是“不速之客”;,直到结束,也没有到来所“期待”的括弧。,1)凡出现左括弧,则进栈;,2)凡出现右括弧,首先检查栈是否空若栈空,则表明该“右括弧”多余,否则和栈顶元素比较,若相匹配,则“左括弧出栈”,否则表明不匹配。,3)表达式检验结束时,若栈空,则表明表达式中匹配正确,否则表明“左括弧”有余。,Statusmatching(string.,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区,并假设“#”为退格符,“”为退行符。,在用户输入一行的过程中,允许用户输入出差错,并在发现有误时可以及时更正。,合理的作法是:,例三、行编辑程序问题,假设从终端接受了这样两行字符:whli#ilr#e(s#*s)outchaputchar(*s=#+);,则实际有效的是下列两行:while(*s)putchar(*s+);,while(ch!=EOF/从终端接收下一个字符,while(ch!=EOF)/EOF为全文结束符,从栈底到栈顶的字符传送至调用过程的数据区;,例四、迷宫求解,求迷宫路径算法的基本思想是:,若当前位置“可通”,则纳入路径,继续前进;,若当前位置“不可通”,则后退,换方向继续探索;,若四周“均无通路”,则将当前位置从路径中删除出去。,设定当前位置的初值为入口位置;do若当前位置可通,则将当前位置插入栈顶;若该位置是出口位置,则算法结束;否则切换当前位置的东邻方块为新的当前位置;否则while(栈不空);,求迷宫中一条从入口到出口的路径的算法:,若栈不空且栈顶位置尚有其他方向未被探索,则设定新的当前位置为:沿顺时针方向旋转找到的栈顶位置的下一相邻块;,若栈不空但栈顶位置的四周均不可通,则删去栈顶位置;/从路径中删去该通道块若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈至栈空;,若栈空,则表明迷宫没有通路。,限于二元运算符的表达式定义:表达式:=(操作数)+(运算符)+(操作数)操作数:=简单变量|表达式简单变量:=标识符|无符号整数,例五、表达式求值,x=4-10/5+2*(3+8)运算符(operator)算术运算符关系运算符逻辑运算符界限符(delimiter)括号结束,规则:先乘除,后加减;从左到右;先括号内,后括号外;把运算符和界限符统称为算符“算符优先法”4-10/5+2*(3+8),44-4-104-10/4-10/54-10/5+=42+4-2+=2+2+22+2*2+2*(2+2*(32+2*(3+2+2*(3+82+2*(3+8)=2+2*11=2+22=26,不论是操作数或运算符,最先输入,最后参与运算;因此,可以考虑使用栈实现。算法设置两个栈,分别存放操作数和运算符;输入操作数时,一定不会运算;运算过程实际就是运算符号比较的过程。,设两个运算符:1,2,a1b2c12,1优先权高于2,可以运算,/表达式求值OpendTypeEvaluateExpression()InitStack(OPTR);Push(OPTR,#);InitStack(OPND);c=getchar();while(!(c=#,elseswitch(Precede(GetTop(OPTR),c)case:Pop(OPTR,t);Pop(OPND,b);Pop(OPND,a);Push(OPND,Operate(a,t,b);break;/switch/if/whilea=GetTop(OPND);DestroyStack(OPTR);DestroyStack(OPND);/EvaluateExpression,3*(72),OPTR栈OPND栈输入操作1#3*(72)#PUSH(OPND,3)2#3*(72)#PUSH(OPTR,*)3#*3(72)#PUSH(OPTR,()4#*(372)#PUSH(OPND,7)5#*(37-2)#PUSH(OPTR,-)6#*(-372)#PHSH(OPND,2)7#*(-372)#operate(7,-,2)8#*(35)#POP(OPTR)9#*35#operate(3,*,5)10#15#returnGetTop(OPND),ADTQueue数据对象:Dai|aiQElemSet,i=1,.,n,n0数据关系:R1|ai-1,aiD,i=2,.,n约定其中a1端为队列头,an端为队列尾,基本操作:,3.3队列,ADTQueue,队列的基本操作:,InitQueue(structQNode*next;QNode,*QueuePtr;,链队列链式映象,typedefstruct/链队列类型QueuePtrfront;/队头指针QueuePtrrear;/队尾指针LinkQueue;,a1,an,Q.frontQ.rear,Q.frontQ.rear,空队列,StatusInitQueue(LinkQueue,StatusEnQueue(LinkQueue,StatusDeQueue(LinkQueue,#defineMAXQSIZE100/最大队列长度typedefstructQElemType*base;/动态分配存储空间intfront;/头指针,若队列不空,/指向队列头元素intrear;/尾指针,若队列不空,指向/队列尾元素的下一个位置SqQueue;,循环队列顺序映象,队列空间实际还有,但表现为缺少空间,a,c,b,空和满时头和尾指针相同,如何解决?,空队列条件:Q.rear=Q.front;满队列条件(Q.rear+1)%maxsize=Q.front;,StatusInitQueue(SqQue

温馨提示

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

评论

0/150

提交评论