第三章栈和队列.ppt
《第三章栈和队列.ppt》由会员分享,可在线阅读,更多相关《第三章栈和队列.ppt(59页珍藏版)》请在三一办公上搜索。
1、第三章栈和队列,3.1 栈3.2 栈的应用3.3 栈与递归的实现3.4 队列,3.1 栈stack,什么是栈?栈的操作原则是什么?若有栈S=(a1,a2,.,an),哪个是栈顶元素,哪个是栈底元素?栈的基本操作有哪些?,窗口函数调用撤消undo,一、栈的定义栈是限定仅在表尾进行插入或删除操作的线性表,表尾称为栈顶(top)表头称为栈底(bottom),火车站,入站,出站,栈的抽象数据类型ADT Stack数据对象:D=a ia i ElemSet,i=1,2,n,n0 数据关系:R=a i-1,a i D,i=2,n 约定a n端为栈顶,a 1端为栈底.基本操作:,DestroyStack(&
2、S);操作结果:栈S被销毁,ClearStack(&S);操作结果:栈S清为空栈.,InitStack(&S);操作结果:构造一个空栈S.,StackLength(S);操作结果:返回S的元素个数,GetTop(S,&e);初始条件:栈S已存在且非空.操作结果:用e返回S的栈顶元素.,StackEmpty(S);操作结果:若栈S为空栈,则返回TRUE,否则FALSE,Push(&S,e);操作结果:插入元素e为新的栈顶元素.,Pop(&S,&e);初始条件:栈S已存在且非空.操作结果:删除S的栈顶元素,并用e返回其值,StackTraverse(S,visit();初始条件:栈S已存在且非空.
3、操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit().一旦visit()失败,则操作失效.,ADT Stack,DestroyStack(&S);,ClearStack(&S);,InitStack(&S);,StackLength(S);,GetTop(S,&e);,StackEmpty(S);,Push(&S,e);,Pop(&S,&e);,StackTraverse(S,visit();,二、栈的表示和实现1顺序栈 利用一组地址连续的空间存放栈底到栈顶的元素 用指针top指出栈顶元素的位置,2顺序栈定义typedef struct SElemType*base;SElemT
4、ype*top;int stacksize;SqStack;,3 顺序栈的实现 栈的顺序存储表示#define STACK_INIT_SIZE 100 存储空间初始分配#define STACKINCREMENT 10 存储空间分配增量,基本操作的函数原型说明 Status InitStack(SqStack 把S置为空栈,Status StackEmpty(SqStack S);若栈S为空栈,则返回TRUE,否则返回FALSEint StackLength(SqStack S);返回S的元素个数,即栈的长度Status GetTop(SqStack S,SElemType 从栈底到栈顶依次对
5、栈中每个元素调用函数visit().一旦visit()失败,则操作失败.,基本操作的算法描述(部分)Status InitStack(SqStack InitStack,100,Status GetTop(SqStack S,SElemType GetTop,Status Push(SqStack Push,e,e,Status Pop(SqStack Pop,e,e,4栈式链*top为首元结点,做栈顶 链式栈是在表头进行插入删除操作的链,a5,a4,a3,a2,a1,top,头结点?,三、多个栈共享空间1两个栈共享空间,32栈的应用,一、数制转换,对于输入的任意一个非负十进制整数打印输出与其
6、等值的八进制数,4107,3,513,1,64,0,8,0,1,1,0,余数产生顺序,八进制输出顺序,void conversion()InitStack(S);建空栈 scanf(printf(%d,e);conversion,二、括号匹配,输入一个符号串,判断其中圆括号和方括号是否匹配,(a b h j(f h(j)k g h),算法思想:(1)凡出现左括号,则进栈(2)凡出现右括号,首先检查栈是否空 如果栈空,表明右括号多了 否则与栈顶元素比较,若相匹配,左括号出栈 否则不匹配(3)表达式检查结束时,若栈空,则匹配正确,Status match()InitStack(S);scanf(c
7、h);while(ch!=n)if(ch=(|ch=)Push(S,ch);else if(ch=)if(StackEmpty(S)return ERROR;Pop(S,t);if(t!=()return ERROR;else if(ch=)if(StackEmpty(S)return ERROR;Pop(S,t);if(t!=)return ERROR;scanf(ch);if(StackEmpty(S)return OK;else return ERROR;/match,三、迷宫求解,墙通道入口出口,墙通道入口出口,算法思想:若当前位置可通,则加入路径 若当前位置不可通,则后退,换一个方向
8、搜索 若四周都不可通,则从路径中删除,路径中最先被删除的位置是最近搜索过的利用栈存放路径,设定当前位置的初值为入口位置;do 若当前位置可通,将当前位置入栈;切换当前位置的东邻方块为新的当前位置;while(栈不空),若当前位置不可通,出栈 找到下一个可能通的位置,设定当前位置的初值为入口位置;do 若当前位置可通,则 将当前位置入栈;纳入路径 若该位置是出口位置,则结束;求得路径存放在栈中 否则切换当前位置的东邻方块为新的当前位置;while(栈不空),否则 若栈不空 出栈e 若e的四周均不可通(或探索过)则继续出栈 若e尚有其他方向未经探索 沿顺时针方向找到新的当前位置,typedef s
9、truct int ord;通道块在路径上的序号 PosType seat;通道块在迷宫中的坐标位置 int di;从此通道块走向下一通道块的方向 SElemType;栈的元素类型,FootPrint(curpos);/记录位置curpos已经搜索过,Pass(curpos)/返回位置curpos是否可通(搜索过),NextPos(curpos,i);/返回从位置curpos按方向i到达的新位置,MarkPrint(curpos);/记录位置curpos4个方向都搜索过不可通,typedef struct int x,y;PosType;坐标,Status MazePath(MazeType
10、maze,PosType start,PosType end)若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中(从栈底到栈顶),并返回TRUE;否则返回FALSE InitStack(S);curpos=start;设定当前位置为入口位置 curstep=1;探索第一步 do if(Pass(curpos)当前位置可以通过,即是未曾走到过的通道块 FootPrint(curpos);留下足迹 e=(curstep,curpos,1);Push(S,e);加入路径 if(curpos=end)return(TRUE);到达终点(出口)curpos=NextPos(cu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 队列
链接地址:https://www.31ppt.com/p-4938865.html