-第三章栈和队列课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《-第三章栈和队列课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 队列 课件
- 资源描述:
-
1、?栈的概念栈的概念栈的存储结构栈的存储结构栈的操作算法栈的操作算法栈的应用栈的应用队列的概念队列的概念队列的存储结构与操作算法队列的存储结构与操作算法队列的操作算法队列的操作算法队列的应用队列的应用3.1 栈栈(Stack)的概念的概念?只允许在一端插入和删除的表?允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)?特点后进先出(LIFO)进栈示例进栈示例出栈示例出栈示例?例例:?假定有4个元素A,B,C,D,按所列次序进栈,试写出所有可能的出栈序列。注意,每一个元素进栈后都允许出栈,如ACDB就是一种出栈序列。?解:可能的出栈序列有ABCD,ABDC,ACBD,ACDB,
2、ADCB,BACD,BADC,BCAD,BCDA,BDCA,CBAD,CBDA,CDBA,DCBA。栈的基本操作1、初始化、初始化2、进栈、进栈PUSH3、出栈、出栈POP4、取栈顶元素、取栈顶元素GetTop5、判栈是否非空、判栈是否非空3.2 栈的存储结构栈的存储结构顺序存储顺序存储-顺序栈顺序栈链式存储链式存储-链栈链栈?template class SeqStackT dataMaxSize;/存放栈元素存放栈元素int top;/栈顶指针栈顶指针public:SeqStack();/构造函数构造函数void Push(T x);/入栈入栈T Pop();/出栈出栈T Top();/取
3、栈顶元素取栈顶元素bool Empty();/判断栈是否为空判断栈是否为空;链式栈的存储?链式栈无栈满问题,空间可扩充?插入与删除仅在栈顶处执行?链式栈的栈顶在链头?template class LinkStackNode*top;/栈顶指针public:LinkStack();/构造函数LinkStack();/析构函数void Push(T x);/入栈T Pop();/出栈T Top();/取栈顶元素bool Empty();/判断链栈是否为空栈;3.3 栈的操作算法栈的操作算法?1.顺序栈的操作算法顺序栈的操作算法?2.链式栈的操作算法链式栈的操作算法1 顺序栈的操作算法顺序栈的操作算
4、法(1)顺序栈的初始化顺序栈的初始化template SeqStack:SeqStack()top=-1;(2)顺序栈的入栈操作顺序栈的入栈操作?template void SeqStack:Push(T x)if(top=MaxSize-1)cerr 上溢;exit(1);top+;datatop=x;(3)顺序栈的出栈操作顺序栈的出栈操作?template T SeqStack:Pop()if(top=-1)cerr 下溢下溢;exit(1);x=datatop;top-;return x;(4)取栈顶元素操作取栈顶元素操作?template T SeqStack:Top()if(top=
5、-1)cerr 下溢;exit(1);return datatop;(5)判断顺序栈是否为空判断顺序栈是否为空?template bool SeqStack:Empty()return top=-1;2 链栈的操作算法链栈的操作算法?(6)链栈初始化链栈初始化?template LinkStack:LinkStack()top=NULL;(7)链栈入栈操作链栈入栈操作(8)template void LinkStack:Push(T x)s=new Node;s-data=x;s-next=top;top=s;(8)链栈出栈操作链栈出栈操作template T LinkStack:Pop()i
6、f(top=NULL)cerrdata;p=top;top=top-next;delete p;return x;(9)取栈顶元素操作取栈顶元素操作?template T LinkStack:Top()if(top=NULL)cerrdata;(10)判断链栈是否为空判断链栈是否为空?template bool LinkStack:Empty()return top=NULL;(11)(11)链栈的析构函数链栈的析构函数template LinkStack:LinkStack()p=top;while(p)q=p;p=p-next;delete q;top=NULL;思考:两个栈共享同一段内容
7、空间,为了使得空思考:两个栈共享同一段内容空间,为了使得空间利用率最高,应如何分配栈空间?间利用率最高,应如何分配栈空间?-两个堆栈共享空间0maxsize-1lefttoprighttop3.4 栈的应用举例栈的应用举例1.栈的应用之一栈的应用之一:递归调用递归调用例例:Hanoi塔问题塔问题.void Hanoi(int n,char a,char b,char c)if(n=1)Move(a,c);else Hanoi(n-1,a,c,b);Move(a,c);Hanoi(n-1,b,a,c);一定要搞清执行过程一定要搞清执行过程2.栈的应用之二栈的应用之二:算术表达式求值算术表达式求值
8、表达式求值是程序设计语言编译中的一个最基本问题。它的实现需要借助栈来完成。这里介绍一种简单直观的算法,即的算法,即“算符优先法算符优先法”。输入包含+、*、/、圆括号和正整数组成的中缀算术表达式,以“”“”作为表达式结束符。计算该表达作为表达式结束符。计算该表达式的运算结果。运算优先级运算优先级当前运算符()(=栈顶运算符算法思想:算法思想:为实现算符优先算法,使用两个工作栈为实现算符优先算法,使用两个工作栈。1.运算符运算符OPTR栈栈,用以寄存运算符;用以寄存运算符;2.操作数操作数OPND栈栈,用以寄存操作数用以寄存操作数或运算结果或运算结果。?(1)首先置操作数栈)首先置操作数栈OPN
9、D为空栈,表达为空栈,表达式起始符式起始符“”“”为运算符的栈底元素;为运算符的栈底元素;?(2)从左到右扫描,依次读入中缀表达)从左到右扫描,依次读入中缀表达式中的每个字符,依次读入表达式中每个式中的每个字符,依次读入表达式中每个字符字符,若是操作数若是操作数,则进则进OPND栈,若是运算栈,若是运算符,则与符,则与OPTR栈的栈顶运算符进行比较,栈的栈顶运算符进行比较,作相应操作,直至整个表达式求值完毕作相应操作,直至整个表达式求值完毕(即(即OPTR栈的栈顶元素和当前读入的字栈的栈顶元素和当前读入的字符均为符均为“”“”)。)。?若读到的是操作符(若读到的是操作符(c),则应与操作符),
10、则应与操作符栈的栈顶元素(栈的栈顶元素(pre_op)进行比较,会)进行比较,会出现以下三种情况:出现以下三种情况:?若若pre_opc,则,则pre_op出栈,并在操出栈,并在操作数栈中退栈作数栈中退栈2次,依次得到操作数次,依次得到操作数b和和a,然后进行然后进行a pre_op b运算,并将运算的结运算,并将运算的结果压入操作数栈中。果压入操作数栈中。(举例举例)算法描述double Expression_Eval()SeqStack OPTR;/运算符栈运算符栈SeqStack OPND;/运算数栈运算数栈OPTR.Push();ch=getchar();?while(ch!=|OPT
11、R.Top()!=)?if(!InOPTR(ch,OP)?OPND.Push(ch);ch=getchar();?/读到的是操作数则入栈读到的是操作数则入栈?else /读到的是操作符读到的是操作符?pre_op=OPTR.Top();?switch(Precede(pre_op,ch)?case:/情况情况?b=OPND.Pop();a=OPND.Pop();?pre_op=OPTR.Pop();?OPND.Push(Operate(a,pre_op,b);?break;?return OPND.Top();后缀表达式求值后缀表达式求值?中缀表达式中缀表达式?后缀表达式后缀表达式?求值求值?
12、将中缀表达式变成等价的后缀表达式时,表将中缀表达式变成等价的后缀表达式时,表达式中操作数次序不变,而操作符次序会发达式中操作数次序不变,而操作符次序会发生变化,同时去掉圆括号。因此设置一个栈生变化,同时去掉圆括号。因此设置一个栈OPTR用以存放操作符。用以存放操作符。?中缀表达式转换为后缀表达式的基本思路中缀表达式转换为后缀表达式的基本思路:?从左到右扫描中缀表达式,依次读入表达从左到右扫描中缀表达式,依次读入表达式中的每个字符,对于不同类型的字符按不式中的每个字符,对于不同类型的字符按不情况进行处理。情况进行处理。?若读到的是操作数,则输出该操作数,并若读到的是操作数,则输出该操作数,并读入
展开阅读全文