《堆栈和队列》PPT课件.ppt
《《堆栈和队列》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《堆栈和队列》PPT课件.ppt(57页珍藏版)》请在三一办公上搜索。
1、第3章 限定性线性表堆栈和队列,3.1 堆栈,3.2 堆栈应用,3.4*优先级队列,栈和队列是两种重要的抽象数据类型,是一类操作受限制的特殊线性表,其特殊性在于限制插入和删除等运算的位置。,3.3 队列,第2页,3.1 堆 栈,3.1.1 堆栈的基本概念,堆栈的定义:限定只能在固定一端进行插入和删除操作的线性表。通常将表中允许进行插入、删除操作的一端称为栈顶(Top),表的另一端被称为栈底(Bottom)。当栈中没有元素时称为空栈。栈的插入操作被形象地称为进栈或入栈,删除操作称为出栈或退栈。栈又称为后进先出的线性表,即LIFO。,第3页,根据栈定义,每次进栈的元素都被放在原栈顶元素之上而成为新
2、的栈顶,而每次出栈的总是当前栈中“最新”的元素,即最后进栈的元素。因此,栈又称为后进先出的线性表。简称为LIFO表。如下图所示:,进栈、出栈图例,第4页,例3-1 利用一个堆栈,如果输入系列由A、B、C组成,试给出全部可能的输出系列和不可能的输出系列。输出系列有:ABC、ACB、BAC、BCA、CBA 不可能的输出系列为:CAB,第5页,3.1.2 栈的抽象数据类型定义,数据元素集合:描述为a0,a1,an-1,ai的数据类型为DataType。关系:栈中数据元素之间是线性关系。基本操作:(1)Initiate(S)初始化堆栈S(2)Push(S,x)入栈(3)Pop(S,d)出栈(4)Get
3、Top(S)取栈顶数据元素(5)NotEmpty(S)堆栈S非空否,第6页,3.1.3 栈的表示和实现顺序堆栈类,栈在计算机中主要有两种基本的存储结构:顺序存储结构和链式存储结构。顺序存储的栈为顺序栈;链式存储的栈为链栈。,第7页,1.顺序堆栈的存储结构,顺序栈是用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时由于栈的操作的特殊性,还必须附设一个位置指针top(栈顶指针)来动态地指示栈顶元素在顺序栈中的位置。通常以top=0表示空栈。其结构如图所示:,其中,a0,a1,a2,a3,a4表示顺序堆栈中已存储的数据元素,stack表示存放数据元素的数组,Ma
4、xStackSize-1表示最大存储单元个数,top表示当前栈顶存储下标。,第8页,class SeqStackprivate:DataType dataMaxStackSize;/顺序堆栈数组int top;/栈顶位置指示器 public:SeqStack(void)top=0;/构造函数SeqStack(void)/析构函数void Push(const DataType item);/入栈DataType Pop(void);/出栈DataType GetTop(void)const;/取栈顶数据元素int NotEmpty(void)const/堆栈非空否return(top!=0);
5、,2.顺序堆栈类的定义和实现,第9页,void SeqStack:Push(const DataType item)/入栈/把元素item入栈;堆栈满时出错退出if(top=MaxStackSize)cout堆栈已满!endl;exit(0);datatop=item;/先存储itemtop+;/然后top加1,第10页,DataType SeqStack:Pop()/出栈/出栈并返回栈顶元素;堆栈空时出错退出if(top=0)cout堆栈已空!endl;exit(0);top-;/top先减1return datatop;/然后取元素返回,第11页,DataType SeqStack:Get
6、Top(void)const/取栈顶数据元素/取当前栈顶数据元素并返回if(top=0)cout堆栈空!endl;exit(0);return datatop-1;/返回当前栈顶元素,第12页,测试主程序如下:#include#include const int MaxStackSize=100;/定义问题要求的元素数目的最大值typedef int DataType;/定义具体问题元素的数据类型#include seqstack.h,3.顺序堆栈类的测试,void main(void)SeqStack myStack;/构造函数无参数时,定义的对象后不带括号DataType test=1,3
7、,5,7,9;int n=5;for(int i=0;in;i+)myStack.Push(testi);while(myStack.NotEmpty()coutmyStack.Pop();程序运行输出结果为:9 7 5 3 1,第13页,3.1.4 链式堆栈类,1.链式堆栈 链式存储结构的堆栈。2.链式栈的存储结构 它是以头指针为栈顶,在头指针处插入或删除,其结构如图所示:,链栈中每个结点由两个域构成:data域和next域,其结点类和类定义分别如下:,template class LinStack;/前视定义,否则友元无法定义,第14页,/结点类 template/模板类型为T class
8、 StackNode friend class LinStack;/定义类LinStack为友元 private:T data;/数据元素 StackNode*next;/指针 public:/构造函数1,用语构造头结点StackNode(StackNode*ptrNext=NULL)next=ptrNext;/构造函数2,用于构造其他结点StackNode(const T,第15页,/链式堆栈类的定义template class LinStack private:StackNode*head;/头指针 int size;public:/数据元素个数public:LinStack(void);
9、/构造函数LinStack(void);/析构函数void Push(const T,第16页,template LinStack:LinStack()/构造函数 head=new StackNode;/头指针指向头结点 size=0;/size的初值为0,template LinStack:LinStack(void)/析构函数/释放所有动态申请的结点空间 StackNode*p,*q;p=head;/p指向头结点while(p!=NULL)/循环释放结点空间 q=p;p=p-next;delete q;,第17页,template int LinStack:NotEmpty(void)co
10、nst/堆栈非空否if(size!=0)return 1;else return 0;,template void LinStack:Push(const T/元素个数加1,第18页,template T LinStack:Pop(void)/出栈 if(size=0)cout*p=head-next;/p指向栈顶元素结点T data=p-data;head-next=head-next-next;/原栈顶元素结点脱链delete p;/释放原栈顶结点空间size-;/结点个数减1return data;/返回原栈顶结点的data域值,第19页,template T LinStack:GetT
11、op(void)const/取栈顶元素return head-next-data;,说明:1)在链栈中的头结点对操作的实现影响不大,栈顶(表头)操作频繁,可不设头结点链栈。2)一般不会出现栈满情况;除非没有空间导致malloc分配失败。3)链栈的入栈、出栈操作就是栈顶的插入与删除操作,修改指针即可完成。4)采用链栈存储方式的优点是,可使多个栈共享空间;当栈中元素个数变化较大,且存在多个栈的情况下,链栈是栈的首选存储方式。,第20页,3.2 堆栈应用,1、括号匹配问题,例:假设一个算法表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个判别表达式中括号是否正确配对的函数。设计思路:用栈暂存
12、左括号,第21页,void ExpIsCorrect(char exp,int n)/判断有n个字符的字符串exp左右括号是否配对正确 SeqStack myStack;/定义顺序堆栈类对象myStack int i;for(i=0;in;i+)if(expi=()|(expi=)|(expi=)myStack.Push(expi);/入栈else if(expi=)/出栈,第22页,else if(expi=),第23页,else if(expi=,第24页,else if(expi=)|(expi=)|(expi=),第25页,2、表达式计算问题,表达式计算是编译系统中的基本问题,其实现方
13、法是堆栈的一个典型应用。在编译系统中,要把便于人理解的表达式翻译成能正确求值的机器指令序列,通常需要先把表达式变换成机器便于理解的形式,这就要变换表达式的表示序列。,假设计算机高级语言中的一个算术表达式为 A+(B-C/D)*E,这种表达式称为中缀表达式,写成满足四则运算规则的相应的后缀表达式即为 ABCD/-E*+,第26页,表达式的三种标识方法:,设 Exp=S1+OP+S2,则称 OP+S1+S2 为前缀表示法,S1+OP+S2 为中缀表示法,S1+S2+OP 为后缀表示法,第27页,编译系统中表达式的计算分为两个步骤:(1)把中缀表达式变换成相应的后缀表达式;(2)根据后缀表达式计算表
14、达式的值。后缀表达式的两个特点:(P72 6、7行)中缀表达式变换为后缀表达式的算法步骤可以总结为:(1)设置一个堆栈,初始时将栈顶元素置为“”。(2)顺序读入中缀表达式,当读到的单词为操作数时就将其输出,并接着读下一个单词。(3)令x1为当前栈顶运算符的变量,x2为当前扫描读到运算符的变量,当顺序从中缀表达式中读入的单词为运算符时就赋予x2,然后比较x1的优先级与x2的优先级。x1x2,x1退栈,写入后缀表达式中;x1=x2=#,算法结束。,第28页,利用堆栈计算后缀表达式值的函数编写如下:void PostExp(LinStack/x入栈,第29页,elsex2=s.Pop();/退栈得操
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 堆栈和队列 堆栈 队列 PPT 课件
链接地址:https://www.31ppt.com/p-5631499.html