山大数据结构5精讲课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《山大数据结构5精讲课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 讲课
- 资源描述:
-
1、2/10/202311.The Abstract Data Type 2.D e r i v e d C l a s s e s a n d Inheritance3.Formula-Based Representation4.Linked Representation5.ApplicationsChapter5 堆栈(Stacks)2/10/202321.堆栈的实现2.堆栈的应用本章重点2/10/202331.定义 堆栈是一个线性表,其插入(也称为添加)和删除操作都在表的同一端进行。2.允许插入和删除的一端被称为栈顶(top),另一端被称为栈底(bot tom)。3.堆栈是一个后进先出(la
2、st-in-first-out,LIFO)的数据结构。堆栈(Stacks)2/10/20234堆栈2/10/20235堆栈ADT2/10/202361.公式化描述(Formula-Based Representation)2.效率、改进3.链 接 描 述(L i n k e d)Representation4.效率比较堆栈2/10/20237n堆栈数据对象是更通用的线性表对象的限制版本。(插入和删除操作仅能在表的同一端进行)n例如,如果把表的左端定义为栈底,右端定义为栈顶,那么堆栈的添加操作等价于在表的右端进行插入操作,删除操作等价于在表的右端进行删除操作。继承2/10/20238templa
3、teclass Stack:private LinearList /LIFO 对象public:Stack(int MaxStackSize=10):LinearList(MaxStackSize)bool IsEmpty()constreturn LinearList:IsEmpty();bool IsFull()constreturn(Length()=GetMaxSize();T Top()constif(IsEmpty()throw OutOfBounds();T x;Find(Length(),x);return x;Stack&Add(const T&x)Insert(Length
4、(),x);return*this;Stack&Delete(T&x)LinearList:Delete(Length(),x);return*this;公式化描述的堆栈类(派生)2/10/20239templateclass Stack /LIFO 对象public:Stack(int MaxStackSize=10);Stack()delete stack;bool IsEmpty()const return top=-1;bool IsFull()const return top=MaxTo p;T Top()const;Stack&Add(const T&x);Stack&Delete
5、(T&x);private:int top;/栈顶int MaxTop;/最大的栈顶值T*stack;/堆栈元素数组;自定义Stack2/10/202310templateStack:Stack(int MaxStackSize)MaxTop=MaxStackSize-1;stack=new TMaxStackSize;top=-1;Stack 类构造函数2/10/202311templateT Stack:Top()constif(IsEmpty()throw OutOfBounds();else return stacktop;复杂性?返回栈顶元素2/10/202312templateSt
6、ack&Stack:Add(const T&x)if(IsFull()throw NoMem();stack+top=x;return*this;复杂性?添加元素x2/10/202313templateStack&Stack:Delete(T&x)if(IsEmpty()throw OutOfBounds();x=stacktop-;return*this;复杂性?删除栈顶元素,并将其送入x2/10/202314哪一端对应栈顶?链表描述2/10/202315templateclass LinkedStack:private Chain public:bool IsEmpty()constret
7、urn Chain:IsEmpty();bool IsFull()const;T Top()constif(IsEmpty()throw OutOfBounds();T x;Find(1,x);return x;LinkedStack&Add(const T&x)Insert(0,x);return*this;LinkedStack&Delete(T&x)Chain:Delete(1,x);return*this;从Chain派生的链表形式的堆栈2/10/202316templatebool LinkedStack:IsFu11()const/堆栈是否满?try ChainNode*p=new
8、 ChainNode;delete p;return false;catch(NoMem)return true;从Chain派生的链表形式的堆栈2/10/202317template class Nodefriend LinkedStack;private:T data;Node*link;自定义链表形式的堆栈2/10/202318templateclass LinkedStack public:LinkedStack()top=0;LinkedStack();bool IsEmpty()const return top=0;bool IsFull()const;T Top()const;L
9、inkedStack&Add(const T&x);LinkedStack&Delete(T&x);private:Node*top;/指向栈顶节点:自定义链表形式的堆栈2/10/202319templateLinkedStack:LinkedStack()Node*next;while(top)next=top-link;delete top;top=next;析构函数2/10/202320templatebool LinkedStack:IsFu11()consttry Node*p=new Node;delete p;return false;catch(NoMem)return tru
10、e;堆栈是否满?2/10/202321templateT LinkedStack:Top()constif(IsEmpty()throw OutOfBounds();return top-data;返回栈顶元素2/10/202322templateLinkedStack&LinkedStack:Add(const T&x)Node*p=new Node;p-data=x;p-link=top;top=p;return*this;添加元素x2/10/202323templateLinkedStack&LinkedStack:Delete(T&x)if(IsEmpty()throw OutOfBo
11、unds();x=top-data;Node*p=top;top=top-link;delete p;return*this;删除栈顶元素,并将其送入x2/10/2023241.链式栈无栈满问题,空间可扩充2.插入与删除仅在栈顶处执行3.链式栈的栈顶在链头4.适合于多栈操作比较2/10/2023251.括号匹配(Parenthesis Matching)2.汉诺塔(Towers of Hanoi)3.火车车厢重排(Rearranging Railroad Cars)4.开关盒布线(Switch Box Routing)5.离线等价类(Offline Equivalence Problem)6.
12、迷宫老鼠(Rat in a Maze)应用2/10/202326n目标:输入一个字符串,输出相互匹配的括号以及未能匹配的括号。n例:字符串(a*(b+c)+d)n例:字符串(a+b)(括号匹配2/10/202327n如果从左至右扫描一个字符串,那么每个右括号将与最近遇到的那个未匹配的左括号相匹配。n如何实现?观察2/10/202328n可以在从左至右的扫描过程中把所遇到的左括号存放到堆栈内。每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该左括号。方法2/10/202329n已知n个碟子和3座塔。初始时所有的碟子按从大到小次序从塔1的底部堆放至顶部,需要把碟子都移动
13、到塔2,每次移动一个碟子,而且任何时候都不能把大碟子放到小碟子的上面。汉诺塔问题2/10/202330n为了把最大的碟子移动到塔2,必须把其余n-1个碟子移动到塔3,然后把最大的碟子移动到塔2。n接下来是把塔3上的n-1个碟子移动到塔2,为此可以利用塔2和塔1。可以完全忽视塔2上已经有一个碟子的事实,因为这个碟子比塔3上将要移过来的任一个碟子都大,因此,可以在它上面堆放任何碟子。汉诺塔问题-递归方法2/10/202331void TowersOfHanoi(int n,int x,int y,int z)/把n 个碟子从塔x 移动到塔y,可借助于塔zif(n 0)TowersOfHanoi(n
14、-1,x,z,y);coutMove top disk from tower x to top of tower yendl;TowersOfHanoi(n-l,z,y,x);求解汉诺塔问题的递归程序2/10/202332n希望给出每次移动之后三座塔的状态(即塔上的碟子及其次序)进一步要求2/10/202333class Hanoifriend void TowersOfHanoi(i n t);public:void TowersOfHanoi(int n,int x,int y,int z);private:Stack*S4;使用堆栈求解汉诺塔问题2/10/202334void Hanoi
15、:TowersOfHanoi(int n,int x,int y,int z)/把n 个碟子从塔x 移动到塔y,可借助于塔zint d;/碟子编号if(n 0)TowersOfHanoi(n-l,x,z,y);Sx-Delete(d);/从x中移走一个碟子Sy-Add(d);/把这个碟子放到y 上ShowState();TowersOfHanoi(n-l,z,y,x);使用堆栈求解汉诺塔问题2/10/202335void TowersOfHanoi(int n)/Hanoi:towersOfHanoi的预处理程序Hanoi X;X.S1=new Stack(n);X.S2=new Stack(
16、n);X.S3=new Stack(n);for(int d=n;d 0;d-)/初始化X.S1-Add(d);/把碟子d 放到塔1上/把塔1上的n个碟子移动到塔2上,借助于塔3 的帮助X.TowersOfHanoi(n,1,2,3);使用堆栈求解汉诺塔问题2/10/202336n在一个转轨站里完成车厢的重排工作,在转轨站中有一个入轨、一个出轨和k个缓冲铁轨(位于入轨和出轨之间)。火车车厢重排问题2/10/202337n从前至后依次检查入轨上的所有车厢。n如果正在检查的车厢就是下一个满足排列要求的车厢,可以直接把它放到出轨上去。如果不是,则把它移动到缓冲铁轨上,直到按输出次序要求轮到它时才将它
17、放到出轨上。n缓冲铁轨按照何种方式使用?火车车厢重排方案2/10/202338bool Railroad(int p,int n,int k)/k 个缓冲铁轨,车厢初始排序为p 1:n/如果重排成功,返回true,否则返回false/如果内存不足,则引发异常NoMem。/创建与缓冲铁轨对应的堆栈LinkedStack*H;H=new LinkedStack k+1;int NowOut=1;/下一次要输出的车厢int minH=n+l;/缓冲铁轨中编号最小的车厢int minS;/minH号车厢对应的缓冲铁轨火车车厢重排程序2/10/202339/车厢重排for(int i=1;i=n;i+)
展开阅读全文