山大数据结构_5精讲课件.ppt
《山大数据结构_5精讲课件.ppt》由会员分享,可在线阅读,更多相关《山大数据结构_5精讲课件.ppt(77页珍藏版)》请在三一办公上搜索。
1、3/13/2023,1,The Abstract Data Type Derived Classes and InheritanceFormula-Based RepresentationLinked RepresentationApplications,Chapter5 堆栈(Stacks),3/13/2023,2,堆栈的实现堆栈的应用,本章重点,3/13/2023,3,定义 堆栈是一个线性表,其插入(也称为添加)和删除操作都在表的同一端进行。允许插入和删除的一端被称为栈顶(top),另一端被称为栈底(bot tom)。堆栈是一个后进先出(last-in-first-out,LIFO)的数据
2、结构。,堆栈(Stacks),3/13/2023,4,堆栈,3/13/2023,5,堆栈ADT,3/13/2023,6,公式化描述(Formula-Based Representation)效率、改进链接描述(Linked)Representation效率比较,堆栈,3/13/2023,7,堆栈数据对象是更通用的线性表对象的限制版本。(插入和删除操作仅能在表的同一端进行)例如,如果把表的左端定义为栈底,右端定义为栈顶,那么堆栈的添加操作等价于在表的右端进行插入操作,删除操作等价于在表的右端进行删除操作。,继承,3/13/2023,8,templateclass Stack:private Li
3、nearList/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,公式化描述的堆栈类(派生),3/13/2023,9,templateclass Stack/LIFO 对
4、象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,自定义Stack,3/13/2023,10,templateStack:Stack(int MaxStackSize)MaxTop=MaxStackSize-1;stack=new TMaxStackSize;top=-1;,Stack 类构造函数,3/13/2023,11,templateT Stack:
5、Top()constif(IsEmpty()throw OutOfBounds();else return stacktop;复杂性?,返回栈顶元素,3/13/2023,12,templateStack 复杂性?,添加元素x,3/13/2023,13,templateStack 复杂性?,删除栈顶元素,并将其送入x,3/13/2023,14,哪一端对应栈顶?,链表描述,3/13/2023,15,templateclass LinkedStack:private Chain public:bool IsEmpty()constreturn Chain:IsEmpty();bool IsFull(
6、)const;T Top()constif(IsEmpty()throw OutOfBounds();T x;Find(1,x);return x;LinkedStack,从Chain派生的链表形式的堆栈,3/13/2023,16,templatebool LinkedStack:IsFu11()const/堆栈是否满?try ChainNode*p=new ChainNode;delete p;return false;catch(NoMem)return true;,从Chain派生的链表形式的堆栈,3/13/2023,17,template class Nodefriend Linked
7、Stack;private:T data;Node*link;,自定义链表形式的堆栈,3/13/2023,18,templateclass LinkedStack public:LinkedStack()top=0;LinkedStack();bool IsEmpty()const return top=0;bool IsFull()const;T Top()const;LinkedStack/指向栈顶节点:,自定义链表形式的堆栈,3/13/2023,19,templateLinkedStack:LinkedStack()Node*next;while(top)next=top-link;de
8、lete top;top=next;,析构函数,3/13/2023,20,templatebool LinkedStack:IsFu11()consttry Node*p=new Node;delete p;return false;catch(NoMem)return true;,堆栈是否满?,3/13/2023,21,templateT LinkedStack:Top()constif(IsEmpty()throw OutOfBounds();return top-data;,返回栈顶元素,3/13/2023,22,templateLinkedStack,添加元素x,3/13/2023,2
9、3,templateLinkedStack,删除栈顶元素,并将其送入x,3/13/2023,24,链式栈无栈满问题,空间可扩充插入与删除仅在栈顶处执行链式栈的栈顶在链头适合于多栈操作,比较,3/13/2023,25,括号匹配(Parenthesis Matching)汉诺塔(Towers of Hanoi)火车车厢重排(Rearranging Railroad Cars)开关盒布线(Switch Box Routing)离线等价类(Offline Equivalence Problem)迷宫老鼠(Rat in a Maze),应用,3/13/2023,26,目标:输入一个字符串,输出相互匹配的
10、括号以及未能匹配的括号。例:字符串(a*(b+c)+d)例:字符串(a+b)(,括号匹配,3/13/2023,27,如果从左至右扫描一个字符串,那么每个右括号将与最近遇到的那个未匹配的左括号相匹配。如何实现?,观察,3/13/2023,28,可以在从左至右的扫描过程中把所遇到的左括号存放到堆栈内。每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该左括号。,方法,3/13/2023,29,已知n个碟子和3座塔。初始时所有的碟子按从大到小次序从塔1的底部堆放至顶部,需要把碟子都移动到塔2,每次移动一个碟子,而且任何时候都不能把大碟子放到小碟子的上面。,汉诺塔问题,3/1
11、3/2023,30,为了把最大的碟子移动到塔2,必须把其余n-1个碟子移动到塔3,然后把最大的碟子移动到塔2。接下来是把塔3上的n-1个碟子移动到塔2,为此可以利用塔2和塔1。可以完全忽视塔2上已经有一个碟子的事实,因为这个碟子比塔3上将要移过来的任一个碟子都大,因此,可以在它上面堆放任何碟子。,汉诺塔问题-递归方法,3/13/2023,31,void TowersOfHanoi(int n,int x,int y,int z)/把n 个碟子从塔x 移动到塔y,可借助于塔zif(n 0)TowersOfHanoi(n-1,x,z,y);coutMove top disk from tower
12、x to top of tower yendl;TowersOfHanoi(n-l,z,y,x);,求解汉诺塔问题的递归程序,3/13/2023,32,希望给出每次移动之后三座塔的状态(即塔上的碟子及其次序),进一步要求,3/13/2023,33,class Hanoifriend void TowersOfHanoi(i n t);public:void TowersOfHanoi(int n,int x,int y,int z);private:Stack*S4;,使用堆栈求解汉诺塔问题,3/13/2023,34,void Hanoi:TowersOfHanoi(int n,int x,i
13、nt 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);,使用堆栈求解汉诺塔问题,3/13/2023,35,void TowersOfHanoi(int n)/Hanoi:towersOfHanoi的预处理程序Hanoi X;X.S1=new Stack(n);X.S2=new Stack(n);X.S3=new Stack(n);for
14、(int d=n;d 0;d-)/初始化X.S1-Add(d);/把碟子d 放到塔1上/把塔1上的n个碟子移动到塔2上,借助于塔3 的帮助X.TowersOfHanoi(n,1,2,3);,使用堆栈求解汉诺塔问题,3/13/2023,36,在一个转轨站里完成车厢的重排工作,在转轨站中有一个入轨、一个出轨和k个缓冲铁轨(位于入轨和出轨之间)。,火车车厢重排问题,3/13/2023,37,从前至后依次检查入轨上的所有车厢。如果正在检查的车厢就是下一个满足排列要求的车厢,可以直接把它放到出轨上去。如果不是,则把它移动到缓冲铁轨上,直到按输出次序要求轮到它时才将它放到出轨上。缓冲铁轨按照何种方式使用?
15、,火车车厢重排方案,3/13/2023,38,bool 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号车厢对应的缓冲铁轨,火车车厢重排程序,3/13/2023,39,/车厢重排for(int i=1;i=n;i+)if(pi=NowOut
16、)/直接输出tcout“将车厢”pi“从入轨移至出轨endl;NowOut+;/从缓冲铁轨中输出while(minH=NowOut)Output(minH,minS,H,k,n);NowOut+;else/将pi 送入某个缓冲铁轨if(!Hold(pi,minH,minS,H,k,n)return false;return true;,火车车厢重排程序,3/13/2023,40,void Output(int,Output 函数,3/13/2023,41,bool Hold(int c,int/车厢索引,Hold函数,3/13/2023,42,/扫描缓冲铁轨for(int i=1;i=k;i+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 _5 讲课
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-3574040.html