栈和队列培训课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《栈和队列培训课件.ppt》由用户(林田)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 队列 培训 课件
- 资源描述:
-
1、12template class Stack public:Stack(int=10);/构造函数构造函数 void Push(const E&item);/进栈进栈 E Pop();/出栈出栈 E getTop();/取栈顶元素取栈顶元素 void makeEmpty();/置空栈置空栈 int IsEmpty()const;/判栈空否判栈空否 int IsFull()const;/判栈满否判栈满否3#include template class SeqStack:public Stack private:int top;/栈顶指针 E*elements;/栈元素数组 int maxSize
2、;/栈最大容量 void overflowProcess();/栈的溢出处理0 1 2 3 4 5 6 7 8 9 maxSize-1top()elements4 public:Stack(int sz=10);/构造函数 Stack()delete elements;void Push(E x);/进栈 int Pop(E&x);/出栈 int getTop(E&x);/取栈顶 void makeEmpty()top=-1;/置空栈 int IsEmpty()const return top=-1;int IsFull()const return top=maxSize-1;5 top空栈t
3、optoptoptopa 进栈b 进栈aababcdee 进栈abcdef 进栈溢出6topc 退栈b 退栈abaa 退栈空空栈topabdd 退栈ctopabctoptoptopabdee 退栈c78顺序栈的操作template void SeqStack:overflowProcess()/私有函数:当栈满则执行扩充栈存储空间处理 E*newArray=new E2*maxSize;/创建更大的存储数组 for(int i=0;i=top;i+)newArrayi=elementsi;maxSize+=maxSize;delete elements;elements=newArray;/改
4、变elements指针;9template void SeqStack:Push(E x)/若栈不满,则将元素x插入该栈栈顶,否则溢出处理 if(IsFull()=true)overflowProcess();/栈满 elements+top=x;/栈顶指针先加1,再进栈;template bool SeqStack:Pop(E&x)/函数退出栈顶元素并返回栈顶元素的值 if(IsEmpty()=true)return false;x=elementstop-;/栈顶指针退1 return true;/退栈成功;10template bool Seqstack:getTop(E&x)/若栈不空
5、则函数返回该栈栈顶元素的地址 if(IsEmpty()=true)return false;x=elementstop;return true;11/栈顶指针相遇栈顶指针退到栈底12bool Push(DualStack&DS,E x,int i)if(DS.t0+1=DS.t1)return false;if(i=0)DS.t0+;else DS.t1-;DS.VDS.ti=x;return true;bool Pop(DualStack&DS,E&x,int i)if(DS.ti=DS.bi)return false;x=DS.VDS.ti;if(i=0)DS.t0-;else DS.t1
6、+;return true;131415链式栈(LinkedStack)类的定义#include#include“stack.h”template struct StackNode /栈结点类定义private:E data;/栈结点数据 StackNode*link;/结点链指针public:StackNode(E d=0,StackNode*next=NULL):data(d),link(next);16template class LinkedStack:public Stack /链式栈类定义 private:StackNode*top;/栈顶指针public:LinkedStack(
7、):top(NULL)/构造函数 LinkedStack()makeEmpty();/析构函数 void Push(E x);/进栈 bool Pop(E&x);/退栈17 bool getTop(E&x)const;/取栈顶 bool IsEmpty()const return top=NULL;void makeEmpty();/清空栈的内容 friend ostream&operator (ostream&os,LinkedStack&s);/输出栈元素的重载操作;18链式栈类操作的实现template LinkedStack:makeEmpty()/逐次删去链式栈中的元素直至栈顶指针为
8、空。StackNode*p;while(top!=NULL)/逐个结点释放 p=top;top=top-link;delete p;template void LinkedStack:Push(E x)/将元素值x插入到链式栈的栈顶,即链头 top=new StackNode(x,top);/创建新结点 assert(top!=NULL);/创建失败退出;19template bool LinkedStack:Pop(E&x)/删除栈顶结点,返回被删栈顶元素的值。if(IsEmpty()=true)return false;/栈空返回 StackNode*p=top;/暂存栈顶元素 top=t
9、op-link;/退栈顶指针 x=p-data;delete p;/释放结点 return true;20template bool LinkedStack:getTop(E&x)const if(IsEmpty()=true)return false;/栈空返回 x=top-data;/返回栈顶元素的值 return true;21template ostream&operator (ostream&os,LinkedStack&s)/输出栈中元素的重载操作 os “栈中元素个数=”s.getSize()endl;LinkNode*p=s.top;int i=0;while(p!=NULL)
10、os +i “:”data link;return os;思考:当进栈元素的编号为思考:当进栈元素的编号为1,2,n时,可能的出时,可能的出栈序列有多少种?栈序列有多少种?u中缀中缀(infix)表示表示 如如 A+B;u前缀前缀(prefix)表示表示 ,如如+AB;u后缀后缀(postfix)表示表示 ,如如 AB+;22A+B*(C-D)-E/Fr1r4r2r3r5中缀表达式中缀表达式 后缀表达式后缀表达式A+B*(C-D)-E/FABCD-*+EF/-232425r1r2r3r4r5r626步步 输入输入 类类 型型 动动 作作 栈内容栈内容 1 置空栈置空栈 空空 2 A 操作数操作
11、数 进栈进栈 A 3 B 操作数操作数 进栈进栈 AB 4 C 操作数操作数 进栈进栈 ABC 5 D 操作数操作数 进栈进栈 ABCD 6-操作符操作符 D、C 退栈退栈,计算计算 C-D,结果结果 r1 进栈进栈 ABr1 7*操作符操作符 r1、B 退栈退栈,计算计算 B*r1,结果结果 r2 进栈进栈 Ar2 8+操作符操作符 r2、A 退栈退栈,计算计算 A+r2,结果结果 r3 进栈进栈 r3 27步步 输入输入 类类 型型 动动 作作 栈内容栈内容 9 E 操作数操作数 进栈进栈 r3E 10 F 操作数操作数 进栈进栈 r3EF 11 操作符操作符 F、E 退栈退栈,计算计算
12、EF,结果结果 r4 进栈进栈 r3r4 12 G 操作数操作数 进栈进栈 r3r4G 13/操作符操作符 G、r4 退栈退栈,计算计算 r4/G,结果结果 r5 进栈进栈 r3r5 14-操作符操作符 r5、r3 退栈退栈,计算计算 r3-r5,结果结果 r6 进栈进栈 r6 28void Calculator:Run()char ch;double newoperand;while(cin ch,ch!=;)switch(ch)case+:case-:case*:case/:case :DoOperator(ch);break;/计算 default:cin.putback(ch);/将字
13、符放回输入流 cin newoperand;/读操作数 S.Push(newoperand);29void Calculator:DoOperator(char op)/从栈S中取两个操作数,形成运算指令并计算进栈 double left,right;bool result;result=Get2Operands(left,right);/退出两个操作数 if(!result)return;switch(op)case+:S.Push(left+right);break;/加 case-:S.Push(left-right);break;/减 case*:S.Push(left*right);
14、break;/乘 case/:if(right!=0.0)S.Push(left/right);break;else cout “除数为0!n”);exit(1);/除 case:S.Push(Power(left,right);/乘幂 30bool Calculator:Get2Operands(double&left,double&right)/从栈S中取两个操作数 if(S.IsEmpty()=true)cerr “缺少右操作数!”endl;return false;S.Pop(right);if(S.IsEmpty()=true)cerr “缺少左操作数!”endl;return fa
15、lse;S.Pop(left);return true;3132一般一般表达式的操作符有表达式的操作符有4种类型:种类型:1 算术操作符算术操作符 如双目操作符(如双目操作符(+、-、*、/和和%)以及单目操作符()以及单目操作符(-)。)。2 关系操作符关系操作符 包括包括、=、。这些操作符主要用于比较。这些操作符主要用于比较。3 逻辑操作符逻辑操作符 如与如与(&)、或、或(|)、非、非(!)。4 括号括号(和和),它们的作用是改变运它们的作用是改变运算顺序。算顺序。33中缀表示 后缀表示先对中缀表达式按运算优先次序加上括号,再把操先对中缀表达式按运算优先次序加上括号,再把操作符后移到右括
16、号的后面并以就近移动为原则,最作符后移到右括号的后面并以就近移动为原则,最后将所有括号消去。后将所有括号消去。如中缀表示如中缀表示 (A+B)*D-E/(F+A*D)+C,其转换为后,其转换为后缀表达式的过程如下:缀表达式的过程如下:(A+B)*D)(E/(F+(A*D)+C)后缀表示后缀表示 A B+D*E F A D*+/-C+34利用栈将中缀表示转换为后缀表示使用栈可将表达式的中缀表示转换成它的后使用栈可将表达式的中缀表示转换成它的后缀表示。缀表示。为了实现这种转换,需要考虑各操作符的优为了实现这种转换,需要考虑各操作符的优先级。先级。35各个算术操作符的优先级isp叫做栈内叫做栈内(i
17、n stack priority)优先级优先级icp叫做栈外叫做栈外(in coming priority)优先级。优先级。操作符优先级相等的情况只出现在操作符优先级相等的情况只出现在括号配括号配对对或或栈底的栈底的“;”号与输入流最后的号与输入流最后的“;”号配号配对对时。时。36中缀表达式转换为后缀表达式的算法操作符栈初始化,将结束符操作符栈初始化,将结束符;进栈。然后进栈。然后读入中缀表达式字符流的首字符读入中缀表达式字符流的首字符ch。重复执行以下步骤,直到重复执行以下步骤,直到ch=;,同时栈,同时栈顶的操作符也是顶的操作符也是;,停止循环。,停止循环。u若若ch是操作数直接输出,读
18、入下一个字是操作数直接输出,读入下一个字符符ch。u若若ch是操作符是操作符,判断,判断ch的优先级的优先级icp和和位位于栈顶于栈顶的的操作符操作符op的优先级的优先级isp:37u若若 icp(ch)isp(op),令,令ch进栈,读入下一进栈,读入下一个字符个字符ch。u若若 icp(ch)isp(op),退栈并输出。,退栈并输出。u若若 icp(ch)=isp(op),退栈但不输出,若,退栈但不输出,若退出的是退出的是“(”号读入下一个字符号读入下一个字符ch。算法结束,输出序列即为所需的后缀表达式算法结束,输出序列即为所需的后缀表达式38步 输入 栈栈内内容容 语义 输出 动作 12
19、-;+*-*操操作作符符*退退栈栈输输出出 13 ;+-;操操作作符符-进进栈栈,读读字字符符 15 E;-E 操操作作数数E输输出出,读读字字符符 16/;-/-操操作作符符/进进栈栈,读读字字符符 17 F;-/F 操操作作数数F输输出出,读读字字符符 18;-/;/操操作作符符/退退栈栈输输出出 19 ;-;-操操作作符符-退退栈栈输输出出 20 ;=;配配对对,转转换换结结束束 3940递归的定义递归的定义 若一个对象部分地包含它自己,或用它自己若一个对象部分地包含它自己,或用它自己给自己定义给自己定义,则称这个对象是递归的;若一则称这个对象是递归的;若一个过程直接地或间接地调用自己个
20、过程直接地或间接地调用自己,则称这个则称这个过程是递归的过程。过程是递归的过程。以下三种情况常常用到递归方法。以下三种情况常常用到递归方法。u 定义是递归的定义是递归的u 数据结构是递归的数据结构是递归的u 问题的解法是递归的问题的解法是递归的41定义是递归的求解阶乘函数的递归算法求解阶乘函数的递归算法long Factorial(long n)if(n=0)return 1;else return n*Factorial(n-1);例如,阶乘函数例如,阶乘函数时时当当时时当当 1,)!1(0,1!nnnnn42求解阶乘 n!的过程 main:factorial(4)参数参数 4 计算计算 4
21、*factorial(3)返回返回 24参数参数 3 计算计算 3*factorial(2)返回返回 6参数参数 2 计算计算 2*factorial(1)返回返回 2参数参数 1 计算计算 1*factorial(0)返回返回 1参数参数 0 直接定值直接定值=1 返回返回 143例如,单链表结构例如,单链表结构一个结点,它的指针域为一个结点,它的指针域为NULL,是一个单,是一个单链表链表;一个结点,它的指针域指向单链表,仍是一一个结点,它的指针域指向单链表,仍是一个单链表。个单链表。数据结构是递归的f f 搜索链表最后一个结点并打印其数值搜索链表最后一个结点并打印其数值template
22、void Print(ListNode*f)if(f-link=NULL)cout data link);f f f f f a0a1a2a3a4递归找链尾4445问题的解法是递归的例,汉诺塔例,汉诺塔(Tower of Hanoi)问题的解法:问题的解法:如果如果 n=1,则将这一个盘子直接从,则将这一个盘子直接从 A 柱移到柱移到 C 柱上。否则,执行以下三步:柱上。否则,执行以下三步:用用 C 柱做过渡,将柱做过渡,将 A 柱上的柱上的(n-1)个盘子个盘子移到移到 B 柱上:柱上:将将 A 柱上最后一个盘子直接移到柱上最后一个盘子直接移到 C 柱上;柱上;用用 A 柱做过渡,将柱做过渡
展开阅读全文