收藏 分享(赏)

数据结构第3章.ppt

上传人:myw993772 文档编号:6214139 上传时间:2019-04-02 格式:PPT 页数:16 大小:524.50KB
下载 相关 举报
数据结构第3章.ppt_第1页
第1页 / 共16页
数据结构第3章.ppt_第2页
第2页 / 共16页
数据结构第3章.ppt_第3页
第3页 / 共16页
数据结构第3章.ppt_第4页
第4页 / 共16页
数据结构第3章.ppt_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、第三章 栈和队列, 3.1 栈 3.2 栈的应用举例 3.3 队列,操作特殊的线性表,进栈出栈的示意图:,3.1 栈,一、栈的特点:满足先进后出,后进先出的线性表。 二、ADT定义:数据对象:D=a i |a i ElemsSet , i=1,2,n, n0 数据关系:R1=|a i-1,a i D , i=1,2,nan端为栈顶,a1端为栈底。基本操作:Initstack(&S) 初始化操作;Destroystack(&S) 销毁栈Stackempty(S) 判栈空函数;Push(&S,x) 入栈操作;Pop(&S,&e) 出栈函数;GetTop(S,&e) 取栈顶元素函数;Clearsta

2、ck(&S) 栈置空操作;Stacklength(S) 求当前栈中元素个数函数。,、顺序结构:利用地址连续的存储单元依次存放自栈底到栈顶的数据元素。type struct SElemType *base;SElemType *top;int stacksize; SqStack ;、链式结构:与线性表类似。,三、栈的存储结构:,3.1 栈,an,a1,an-1,S,栈顶,栈底,思考题,1、已知入栈序列为XYZW,以下序列哪些是允许的出栈序列:WZYX,XYZW,ZYXW,ZXYW。 2、已知入栈序列为XYZ,现有两个单元的栈空间,问你能调度出多少种出栈序列。,数制转换:将十进制转化为任意进制,

3、3.2 栈的应用举例,void conversion() Initstack(S);scanf(“%d”,N);while(N)Push(S, N%8);N = N/8;while (! Stackempty(S) Pop(S,e);Printf(“%d”,e); ,括号匹配的检验1.只有小括号的表达式2.包含有各种括号的表达式 行编辑程序,3.2 栈的应用举例,void Linedit() Initstack(S); ch = getchar();while (ch !=EOF) while (ch != EOF ,迷宫求解:这是栈的应用的典型例题。具体算法思想是:,3.2 栈的应用举例,从

4、演示过程可见: 1从入口进入迷宫之后,不管在迷宫的哪一个位置上,都是先往东走,如果走得通就继续往东走,如果在某个位置上往东走不通的话,就依次试探往南、往西和往北方向,从一个走得通的方向继续往前直到出口为止; 2如果在某个位置上四个方向都走不通的话,就退回到前一个位置,换一个方向再试,如果这个位置已经没有方向可试了就再退一步,如果所有已经走过的位置的四个方向都试探过了,一直退到起始点都没有走通,那就说明这个迷宫根本不通; 3所谓“走不通“不单是指遇到“墙挡路“,还有“已经走过的路不能重复走第二次“,它包括“曾经走过而没有走通的路“。 显然为了保证在任何位置上都能沿原路退回,需要用一个“后进先出“

5、的结构即栈来保存从入口到当前位置的路径。并且在走出出口之后,栈中保存的正是一条从入口到出口的路径。,由此,求迷宫中一条路径的算法的基本思想是: 若当前位置“可通“,则纳入“当前路径“,并继续朝“下一位置“探索;若当前位置“不可通“,则应顺着“来的方向“退回到“前一通道块“,然后朝着除“来向“之外的其他方向继续探索;若该通道块的四周四个方块均“不可通“,则应从“当前路径“上删除该通道块。,3.2 栈的应用举例表达式求值,1、比较优先级存储取括号 运算+ - * / ( ) #+ - * / ( # =,3.2 栈的应用举例表达式求值,2、算法思想:,为实现算符优先法,可以使用两个工作栈。一个称做

6、OPTR,用以寄存运算符;另一个称做OPND,用以寄存操作数或运算结果。基本思想:1)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;2)依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符为“#”)。,3.2 栈的应用举例表达式求值,3、算法实现:例:3*(7-2)#,Operandtype EvaluateExpress() Initstack(OPTR);Push(OPTR,#);Initstack(OPND); c = getchar();while

7、 ( c != # | Gettop(OPTR) != #) if ( ! In(c,op) Push(OPND,c) ; c = getchar();else switch (Precede(Gettop(OPTR),c) case : Pop(OPTR,theta);Pop(OPND,b); Pop(OPND,a);Push(OPND, Operate( a theta b); break;return Gettop(OPND);,递归的实现:递归算法实现必须使用栈。Hanoi塔就是典型例子。,3.2 栈的应用举例,Void hanoi( int n, char x, char y cha

8、r z) 1 if (n=1) 2move(x,1,z); 3else 4hanoi(n-1,x,z,y); 5move(x,n,z); 6hanoi(n-1,y,x,z); 7 8 9,一个递归函数的运行过程类似于多个函数的嵌套调用,差别仅在于“调用函数和被调用函数是同一个函数“。为了保证“每一层的递归调用“都是对“本层“的数据进行操作,在执行递归函数的过程中需要一个“递归工作栈“。它的作用是:一、将递归调用时的实在参数和函数返回地址传递给下一层执行的递归函数;二、保存本层的参数和局部变量,以便从下一层返回时重新使用它们。,递归过程执行过程中所占用的数据区,称之为递归工作栈。 每一层的递归参

9、数等数据合成一个记录,称之为递归工作记录。 栈顶记录指示当前层的执行情况,称之为当前活动记录。 递归工作栈的栈顶指针,称之为当前环境指针。,3.3 队列,一、队列的特点:满足先进先出,后进后出的线性表。 二、ADT定义:数据对象:D=a i |a i ElemsSet , i=1,2,n, n=0 数据关系:R1=|a i-1,a i D , i=1,2,nan端为队列尾,a1端为队列头。基本操作:Initqueue(&Q) Destroyqueue(&Q)Clearqueue(&Q)Queueempty(Q)Gethead(Q,&e)Queuelength(Q)Enqueue(&Q,e)De

10、queue(&Q,&e),3.3 队列,三、链队列的表示和实现:表示:type struct QNode typedef struct QElemType data; QueuePtr front;struct Qnode *next; QueuePtr rear; Qnoode, *QueuePtr ; LinkQueue;,a1,an,a2,Q,front,rear,四循环队列(顺序结构),3.3 队列,1、顺序结构的表示:用一维数组存储队列。实现入列时在最后插入;出列时可删除队头元素,按线性表的操作方法从第二个元素开始逐个前移,由于队列出列操作较频繁,因此这样的移动不是较好的方法。由此改

11、为指针移动。,Q.front,Q.rear,循环队列是队列的一种顺序存储表示。那么为什么要称作“循环队列“而不说是“顺序队列“呢?,这是由于队列操作(在队尾插入元素,而在队头删除元素)的特殊性造成的。这好比我们在食堂排队买饭,因为柜台是固定位置不动的,则每次排头的人买完离开队伍之后,后面的人依次往前“移动“一个位置,为了避免“移动“可以改一种方式。让吃饭的人围着圆桌“依次“入座,而食堂的师傅推着小车围着圆桌按先后落座的次序“依次“卖饭,并假定“先来的先走“ 。则就是“循环队列“的一种模拟。,四循环队列(顺序结构),3.3 队列,2、队列的假溢出现象避免假溢出:把队列设想为一个循环的表。循环队列

12、:即是队列的顺序存储结构。3、循环队列中当Q.front=Q.rear是“空”还是“满”?解决方法:(1)设置标志域(2)少用一个元素空间当Q.front=(Q.rear+1)%MAXSIZE时为满当Q.front=Q.rear时为空 五队列的应用离散时间模拟银行业务模拟,思考题:,、一入栈序列为123456,能否得到435612和135426的出栈序列。 、写出判断一个表达式中开、闭括号是否配对出现的算法。 、设有一表达式为(a+b)/c+b*(e-f)*g,试写出其前缀、中缀、后缀表示形式;并考虑采用此做为输入形式时,能否优化表达式求值的算法。 4、有一空间足够的静态存储队列共有10个元素,出列采用移动操作,现在进行3次出列,2次入列后再进行2次出列,1次入列。问队列中的元素共移动了多少次?,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报