收藏 分享(赏)

3-第三章.ppt

上传人:mcady 文档编号:7313275 上传时间:2019-05-14 格式:PPT 页数:23 大小:433.50KB
下载 相关 举报
3-第三章.ppt_第1页
第1页 / 共23页
3-第三章.ppt_第2页
第2页 / 共23页
3-第三章.ppt_第3页
第3页 / 共23页
3-第三章.ppt_第4页
第4页 / 共23页
3-第三章.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、第三章 栈和队列,栈和队列是两种特殊的线性表应用 3.1 栈(stack) 栈的定义和特点 定义:限定仅在表尾进行插入或删除操作的线性表,表尾栈顶,表头栈底,不含元素的空表称空栈 特点:先进后出(FILO)或后进先出(LIFO),栈的表示和实现 顺序栈 实现:一维数组sM,栈顶指针top,指向实际栈顶 后的空位置,初值为0,进栈,A,出栈,栈满,B,C,D,E,F,设数组维数为M top=0,栈空,此时出栈,则下溢(underflow) top=M,栈满,此时入栈,则上溢(overflow),栈空,ADT Stack 数据对象:D | ElemSet, i=1,2,.,n, n0 数据关系:数

2、据元素间呈线性关系。基本操作:InitStack(&S):初始化操作。构造一个空栈 S。ClearStack(&S):将S清为空栈。Empty(&S):判断栈是否为空,若为空栈,则返回值为 “TRUE”,否则返回值为“FALSE”。Pop(&S):出栈函数。若S不为空,则从栈中删除栈顶元素, 并返回栈顶元素的值,否则返回NULL。Full(&S):判断栈是否为满,若为满栈,则返回值为“TRUE”,否则返回值为“FALSE”。Push(&S,t):入栈操作。若S不为满,则插入t为栈中栈顶元素,否则返回NULL。GetTop(&S):函数返回栈顶元素的值。 ,堆栈的实现,#include #def

3、ine MAXITEM 200 typedef enum FALSE,TRUE bool; typedef struct int itemMAXITEM; int top; Stack; Stack s;,void ClearStack(Stack *s) s-top = 0; bool Empty(Stack *s) if (s-top=0) return TRUE; else return FALSE; ,bool Full(Stack *s)if (s-top = MAXITEM-1)return TRUE;elsereturn FALSE; ,bool Push(stack *s, i

4、nt t) if(Full(s) )return FALSE;else s-items-top = t; s-top+; return TRUE; ,int Pop(stack *s) if (Empty(s) return FALSE; else s-top-; return s-items-top; ,int GetTop(stack *s) if (Empty(s) return FALSE; elsereturn s-items-top; ,链栈,结点定义,入栈算法,出栈算法,typedef struct node int data;struct node *link; JD;,栈的应

5、用 过程的嵌套调用,例 递归的执行情况分析,递归过程及其实现 递归:函数直接或间接的调用自身叫 实现:建立递归工作栈,void print(int w) int i;if ( w!=0) print(w-1);for(i=1;i=w;+i)printf(“%3d,”,w);printf(“/n”); ,Ch3_10.c,运行结果: 1, 2,2, 3,3,3,,Tower of Hanoi问题 问题描述:有A,B,C三个塔座,A上套有n个直径不同的圆盘,按直径从小到大叠放,形如宝塔,编号1,2,3n。要求将n个圆盘从A移到C,叠放顺序不变,移动过程中遵循下列原则: 每次只能移一个圆盘 圆盘可在

6、三个塔座上任意移动 任何时刻,每个塔座上不能将大盘压到小盘上,解决方法: n=1时,直接把圆盘从A移到C n1时,先把上面n-1个圆盘从A移到B,然后将n号盘从A移到C,再将n-1个盘从B移到C。即把求解n个圆盘的Hanoi问题转化为求解n-1个圆盘的Hanoi问题,依次类推,直至转化成只有一个圆盘的Hanoi问题 算法:,执行情况: 递归工作栈保存内容:形参n,x,y,z和返回地址 返回地址用行编号表示,回文游戏:顺读与逆读字符串一样(不含空格),1.读入字符串 2.去掉空格(原串) 3.压入栈 4.原串字符与出栈字符依次比较若不等,非回文若直到栈空都相等,回文,多进制输出:,字符串:“ma

7、dam im adam”,括号匹配的检验假设表达式中充许括号嵌套,则检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。例:()() ()行编辑程序在编辑程序中,设立一个输入缓冲区,用于接受用户输入的一行字符,然后逐行存入用户数据区。允许用户输入错误,并在发现有误时可以及时更正。,表达式求值,中缀表达式 后缀表达式(RPN)a*b+c ab*c+a+b*c abc*+a+(b*c+d)/e abc*d+e/+,中缀表达式:操作数栈和运算符栈,例 计算 2+4-3*6,错误!,24+36*-,3.2 队列 队列的定义及特点 定义:队列是限定只能在表的一端进行插入,在表的另一端进行删除的线

8、性表 队尾(rear)允许插入的一端 队头(front)允许删除的一端 队列特点:先进先出(FIFO),双端队列,队列,ADT Queue数据对象:D | ElemSet, i=1,2,.,n, n0 数据关系:数据元素间呈线性关系。基本操作:InitQueue(&Q):构造一个空队列 Q。 ClearQueue(&Q):将已存在的队列Q清为空队列。QueueEmpty(Q):若Q为空队列,则返回TRUE,否则返回FALSE。 EnQueue(&Q,e):插入元素e为Q的新的队尾元素。DeQueue(&Q,&e):删除Q的队头元素,并用e返回其值。GetHead(&Q,&e):用e返回Q的队头

9、元素。 ,链队列 结点定义,typedef struct Qnode QElemType data;struct Qnode *next; Qnode,*QueuePtr; Typedef structQueuePtr front;QueuePtr rear; /LinkQueue;,设队首、队尾指针front和rear, front指向头结点,rear指向队尾,队列的顺序表示和实现 实现:用一维数组实现sqM,J1,J2,J3,设两个指针front,rear,约定: rear指示队尾元素; front指示队头元素位置 初值front=rear=0,空队列条件:front=rear 入队列:s

10、q+rear=x; 出队列:x=sq+front;,从1开始 少用一元素,存在问题 设数组维数为M,则: 当front=0,rear=M-1时,再有元素入队发生溢出真溢出 当front0,rear=M-1时,再有元素入队发生溢出假溢出 解决方案 队首固定,每次出队剩余元素向下移动浪费时间 循环队列 基本思想:把队列设想成环形,让sq0接在sqM-1之后,若rear+1=M,则令rear=0;,实现:利用“模”运算 入队: rear=(rear+1)%M; sqrear=x; 出队: front=(front+1)%M; x=sqfront; 队满、队空判定条件,队空:front=rear 队满:front=rear,解决方案: 1.另外设一个标志以区别队空、队满 2.少用一个元素空间:队空:front=rear队满:(rear+1)%M=front,

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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