第3章 堆栈和队列.ppt
《第3章 堆栈和队列.ppt》由会员分享,可在线阅读,更多相关《第3章 堆栈和队列.ppt(63页珍藏版)》请在麦多课文档分享上搜索。
1、第3章 堆栈和队列,主要知识点,堆栈 堆栈应用 队列 队列应用 优先级队列,3.1 堆 栈,1、堆栈的基本概念,(1)定义:限定只能在固定一端进行插入和删除操作的线性表。特点:后进先出。,(2)允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。,作用:可以完成从输入数据序列到某些输出数据序列的转换,2、堆栈抽象数据类型 数据集合: a0,a1,an-1ai的数据类型为DataType。 操作集合:(1) StackInitiate(S) :初始化堆栈S(2) StackNotEmpty(S):堆栈S非空否 (3) StackPush(S, x) :入栈(4) StackPop(S, d):
2、出栈(5) StackTop(S, d):取栈顶数据元素,3、顺序堆栈,顺序堆栈:顺序存储结构的堆栈。顺序栈的存储结构:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素.,typedef struct DataType stackMaxStackSize; int top; SeqStack;,顺序堆栈的操作实现: (1)初始化StackInitiate(S) void StackInitiate(SeqStack *S) S-top = 0; (2)非空否StackNotEmpty(S) int StackNotEmpty(SeqStack S) if(S.top = 0)retur
3、n 0;else return 1; ,(3)入栈StackPush(S, x) int StackPush(SeqStack *S, DataType x) if(S-top = MaxStackSize) printf(“堆栈已满无法插入! n“);return 0;else S-stackS-top = x;S-top +;return 1; ,(4)出栈StackPop(S, d) int StackPop(SeqStack *S, DataType *d) if(S-top top -;*d = S-stackS-top;return 1; ,(5)取栈顶数据元素StackTop(S
4、eqStack S, DataType *d) int StackTop(SeqStack S, DataType *d) if(S.top = 0) printf(“堆栈已空! n“);return 0;else *d = S.stackS.top - 1;return 1; ,测试主程序: 任务:建立一个顺序堆栈,首先依次输入数据元素1, 2, 3,10,然后依次出栈堆栈中的数据元素并显示。假设该顺序堆栈的数据元素个数在最坏情况下不会超过100个。 #include #include #define MaxStackSize 100 typedef int DataType; #inclu
5、de “SeqStack.h“,void main(void) SeqStack myStack;int i , x;StackInitiate( ,程序运行输出结果如下:当前栈顶数据元素为:10依次出栈的数据元素序列如下: 10 9 8 7 6 5 4 3 2 1,4、链式堆栈,1)链式堆栈链式存储结构的堆栈。 2)链式栈的存储结构它是以头指针为栈顶,在头指针处插入或删除,带头结点的链式堆栈结构:,链栈中每个结点由两个域构成:data域和next域,结点结构体定义如下: typedef struct snode DataType data;struct snode *next; LSNode
6、;,3)链式堆栈的操作实现 (1)初始化StackInitiate(head)void StackInitiate(LSNode *head) *head = (LSNode *)malloc(sizeof(LSNode) ; (*head)-next = NULL;,(2)非空否StackNotEmpty(head)int StackNotEmpty(LSNode *head) if(head-next = NULL) return 0;else return 1;,(3)入栈StackPush(head, x)int StackPush(LSNode *head, DataType x)
7、LSNode *p;p = (LSNode *)malloc(sizeof(LSNode) ; p-data = x;p-next = head-next;head-next = p; return 1;,(4)出栈StackPop(head, *d)int StackPop(LSNode *head, DataType *d) LSNode *p = head-next;if(p = NULL) printf(“堆栈已空出错!“);return 0;head-next = p-next;*d = p-data; free(p); return 1; ,(5)取栈顶数据元素StackTop(h
8、ead, d)int StackTop(LSNode *head, DataType *d)LSNode *p = head-next;if(p = NULL) printf(“堆栈已空出错!“);return 0;*d = p-data;return 1;,(6)撤消动态申请空间Destroy(*head)void Destroy(LSNode *head)LSNode *p, *p1;p = head;while(p != NULL) p1 = p;p = p-next;free(p1);,说明: 1) 链栈的入栈、出栈操作就是栈顶的插入与删除操作,修改指针即可完成。 2)一般不会出现栈满
9、情况;除非没有空间导致malloc分配失败。 3)采用链栈存储方式的优点是,当栈中元素个数变化较大,准确数字难以确定时,链栈较顺序堆栈方便。,3.2 堆栈应用,1、括号匹配问题,例:假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个判别表达式中括号是否正确配对的函数,并设计一个测试主函数。 解题:这是一个输入元素序列到特定输出元素序列转换问题。 算法思想:算术表达式中右括号和左括号匹配的次序正好符合后到的括号要最先被匹配的“后进先出”堆栈操作特点,因此可以借助一个堆栈来进行判断。 括号匹配共有四种情况: (1)左右括号配对次序不正确;(2)右括号多于左括号; (3)左括号多
10、于右括号; (4)左右括号匹配正确。,具体方法:顺序扫描算术表达式(表现为一个字符串),当遇到三种类型的左括号时让该括号进栈;当扫描到某一种类型的右括号时,比较当前栈顶括号是否与之匹配,若匹配则退栈继续进行判断;若当前栈顶括号与当前扫描的括号不相同,则左右括号配对次序不正确;若字符串当前为某种类型左括号而堆栈已空,则右括号多于左括号;字符串循环扫描结束时,若堆栈非空(即堆栈中尚有某种类型左括号),则说明左括号多于右括号;否则,左右括号匹配正确。 括号匹配共有四种情况: (1)左右括号配对次序不正确: “()abc()“ (2)右括号多于左括号: “()abc“ (3)左括号多于右括号: “()
11、()abc“ (4)左右括号匹配正确: “()abc“,void ExpIsCorrect(char exp, int n) SeqStack myStack; int i;char c;StackInitiate(,else if(expi = ,else if(expi = ) | (expi = ) | (expi = ) ,2、表达式计算问题,表达式计算是编译系统中的基本问题,其实现方法是堆栈的一个典型应用。在编译系统中,要把便于人理解的表达式翻译成能正确求值的机器指令序列,通常需要先把表达式变换成机器便于理解的形式,这就要变换表达式的表示序列。,假设计算机高级语言中的一个算术表达式为
12、A+(B-C/D)*E,这种表达式称为中缀表达式,写成满足四则运算规则的相应 的后缀表达式即为ABCD/-E*+优点:可以直接计算中缀表达式的值。编译系统中表达式的计算分为两个步骤:(1)把中缀表达式变换成相应的后缀表达式;(2)根据后缀表达式计算表达式的值。 其中,步骤(1)这种数据序列的特定变换可以利用堆栈来实现; 步骤(2)的算法也可借助堆栈来实现。,中缀表达式变换为后缀表达式的算法步骤可以总结为:( 1 ) 设置一个堆栈,初始时将栈顶元素置为“”。( 2 ) 顺序读入中缀表达式,当读到的单词为操作数时就将其输出,并接着读下一个单词。( 3 ) 令x1为当前栈顶运算符的变量,x2为当前扫
13、描读到运算符的变量,当顺序从中缀表达式中读入的单词为运算符时就赋予x2,然后比较x1的优先级与x2的优先级,若x1的优先级高于x2的优先级,将x1退栈并作为后缀表达式的一个单词输出,然后接着比较新的栈顶运算符x1的优先级与x2的优先级。如:中缀表达式A+(B-C/D)*E后缀表达式ABCD/-E*+,运算符优先级关系表,把中缀表达式A+(B-C/D)*E变换成后缀表达式的过程,计算后缀表达式的值的过程仍是一个堆栈应用问题,算法思想是:设置一个堆栈存放操作数,从左到右依次扫描后缀表达式,每读到一个操作数就将其进栈;每读到一个运算符就从栈顶取出两个操作数施以该运算符所代表的运算操作,并把该运算结果
14、作为一个新的操作数入栈;此过程一直进行到后缀表达式读完,最后栈顶的操作数就是该后缀表达式的运算结果。,后缀表达式ABCD/-E*+求值过程:,3.3 队 列,1、队列的基本概念,(1)定义:只能在表的一端进行插入操作,在表的另一端进行删除操作的线性表。一个队列的示意图如下:,队尾插入,队头删除,数据集合:a0,a1,an-1,ai的数据类型为DataType。 操作集合: (1)初始化QueueInitiate(Q) (2)非空否QueueNotEmpty(Q) (3)入队列QueueAppend(Q, x) (4)出队列QueueDelete(Q, d) (5)取队头数据元素QueueGet
15、(Q, d),3、顺序队列,(1)顺序队列: 顺序存储结构的队列。,2、队列抽象数据类型,(2)顺序队列的存储结构有6个存储空间的顺序队列动态示意图,(3)顺序队列的“假溢出”问题,假溢出顺序队列因多次入队列和出队列操作后出现的虽有存储空间但不能进行入队列操作的情况。,可采取四种方法:1)采用顺序循环队列;(教材中的方法)2)按最大可能的进队操作次数设置顺序队列的最大 元素个数;(最差的方法)3)修改出队算法,使每次出队列后都把队列中剩余 数据元素向队头方向移动一个位置;)修改入队算法,增加判断条件,当假溢出时,把队列中的数据元素向对头移动,然后方完成入队操作。,如何解决顺序队列的假溢出问题?
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 堆栈 队列 PPT
