




已阅读5页,还剩70页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章堆栈,-后进先出:一种操作受限的线性表,.,2,主要内容,堆栈的定义堆栈的描述公式化描述链表描述堆栈的应用括号匹配、汉诺塔、火车车厢重排迷宫、开关盒布线、离线等价类,.,堆栈定义,栈顶,栈底,堆栈(stack)是一个线性表,其插入和删除操作都在表的同一端进行,这端被称为栈顶(top),另一端被称为栈底(bottom)LIFOLastin,Firstout,.,.,5,.,抽象数据类型,抽象数据类型Stack实例元素线性表,栈底,栈顶操作Create():创建一个空的堆栈IsEmpty():如果堆栈为空,则返回true,否则返回falseIsFull():如果堆栈满,则返回true,否则返回falseTop():返回栈顶元素Push(x):向堆栈中添加元素xPop(x):删除栈顶元素,并将它传递给x,.,7,主要内容,堆栈的定义堆栈的描述公式化描述链表描述堆栈的应用括号匹配、汉诺塔、火车车厢重排迷宫、开关盒布线、离线等价类,.,公式化描述:继承线性表,templateclassStack:privateLinearList/LIFOobjectspublic:Stack(intMaxStackSize=10):LinearList(MaxStackSize)boolIsEmpty()constreturnLinearList:IsEmpty();boolIsFull()constreturn(Length()=GetMaxSize();,线性表尾部作为栈顶,.,公式化描述(续),TTop()constif(IsEmpty()throwOutOfBounds();Tx;Find(Length(),x);returnx;Stack,取栈顶提取最后一个元素,压栈添加到表尾,出栈提取最后一个元素,.,实现方法分析,IsFull需要获取数组大小方法一将类LinearList的成员MaxSize变为protected类型方法二:LinearList类增加函数protected:intGetMaxSize()constreturnMaxSize;LinearList类的变化不会影响Stack类,更好!,.,实现方法分析,继承方式为什么是private?private继承会把基类的所有成员变为派生类的私有成员栈虽可看作线性表的特例,但毕竟不是用户使用Stack类,我们希望他们使用Push、Pop,而不是Insert、Delete而private继承恰好可使Insert、Delete成为Stack的私有成员,用户无法看到,.,Stack的效率,构造函数、析构函数与LinearList相同T:基本类型,(1)T:用户自定义类,(MaxStackSize)其他函数:(1),.,H1.自定义的Stack类,templateclassStackpublic:Stack(intMaxStackSize=10);Stack()deletestack;boolIsEmpty()constreturntop=-1;boolIsFull()constreturntop=MaxTop;TTop()const;Stack,.,构造函数,templateStack:Stack(intMaxStackSize)/Stackconstructor.MaxTop=MaxStackSize-1;stack=newTMaxStackSize;top=-1;,空栈,.,Top函数,templateTStack:Top()const/Returntopelement.if(IsEmpty()throwOutOfBounds();returnstacktop;,.,Push函数,templateStack,.,Pop函数,templateStack,.,数组描述缺陷,与线性表数组描述类似,空间利用率低两个堆栈特例,空间利用率较高Push最坏情况(数组满)仍为(ArraySize)Pop(1),.,19,主要内容,堆栈的定义堆栈的描述公式化描述链表描述堆栈的应用括号匹配、汉诺塔、火车车厢重排迷宫、开关盒布线、离线等价类,.,链表描述,栈顶在链表哪一端?尾节点Push(x)Insert(n,x):(n)Pop(x)Delete(n,x):(n)首节点Push(x)Insert(0,x):(1)Pop(x)Delete(1,x):(1),.,LinkedStack类,templateclassLinkedStack:privateChainpublic:boolIsEmpty()constreturnChain:IsEmpty();boolIsFull()const;TTop()constif(IsEmpty()throwOutOfBounds();Tx;Find(1,x);returnx;,.,LinkedStack类,LinkedStack,.,IsFull函数,templateboolLinkedStack:IsFull()const/Isstackfull?tryChainNode*p=newChainNode;deletep;returnfalse;catch(NoMem)returntrue;笨拙!,.,H2.自定义的链表实现,templateclassNodefriendLinkedStack;private:Tdata;Node*link;,.,自定义的链表实现(续),templateclassLinkedStackpublic:LinkedStack()top=0;LinkedStack();boolIsEmpty()constreturntop=0;boolIsFull()const;TTop()const;LinkedStack,.,析构函数,templateLinkedStack:LinkedStack()/Stackdestructor.Node*next;while(top)next=top-link;deletetop;top=next;,.,IsFull函数,templateboolLinkedStack:IsFull()const/Isthestackfull?tryNode*p=newNode;deletep;returnfalse;catch(NoMem)returntrue;,.,Top函数,templateTLinkedStack:Top()const/Returntopelement.if(IsEmpty()throwOutOfBounds();returntop-data;,.,Push,templateLinkedStack,.,Pop,templateLinkedStack,.,31,H1-2小结,堆栈的两种实现方式,.,32,主要内容,堆栈的定义堆栈的描述公式化描述链表描述堆栈的应用括号匹配、汉诺塔、火车车厢重排迷宫、开关盒布线、离线等价类,.,括号匹配,(a*(b+c)+d)+(e-b)符合语法(a+b)(不符合语法寻找匹配括号对正确处理和未匹配括号错误报告括号匹配是一个基础问题,可以引申到C+编译器数学公式自动求解,.,34,.,35,.,算法设计思路,(a*(b+c)+d)+(e-b),匹配括号的规律?右括号与谁匹配(如果有的话)?由左至右处理符号的话,“右”“后”,靠后的先匹配LIFO用一个栈保存未匹配的左括号由左至右扫描表达式串,遇左括号,push遇右括号,与栈顶左括号匹配,pop,嵌套或者并列,最近(右)未匹配左括号,.,匹配失败的情况,(a+b)(失败情况的规律两种情况对应栈中情况,右括号之前无与之匹配的左括号左括号之后无与之匹配的右括号,遇到一个右括号时,无未匹配的左括号栈空右括号都处理完时,还有未匹配的左括号表达式串处理完时,栈不空,.,括号匹配程序,#include#include#include#includestack.hconstintMaxLength=100;/maxexpressionlength,.,括号匹配程序(续),voidPrintMatchedPairs(char*expr)/Parenthesismatching.Stacks(MaxLength);intj,length=strlen(expr);/scanexpressionexprfor(and)for(inti=1;i=length;i+)if(expri-1=()s.Push(i);,.,括号匹配程序(续),elseif(expri-1=)trys.Pop(j);/unstackmatchcoutjiendl;catch(OutOfBounds)coutNomatchforrightparenthesis”atiendl;,.,括号匹配程序(续),/remaining(instackareunmatchedwhile(!s.IsEmpty()s.Pop(j);coutNomatchforleftparenthesisatjendl;,.,括号匹配程序(续),voidmain(void)charexprMaxLength;coutTypeanexpressionoflengthatmostMaxLengthendl;cin.getline(expr,MaxLength);coutThepairsofmatchingparenthesesin”endl;puts(expr);coutare0)TowersOfHanoi(n-1,x,z,y);coutMovetopdiskfromtowerxtotopoftoweryPop(d);/removeadiskfromxSy-Push(d);/putthisdiskontowerycoutMovediskdfromtowerxtotoweryPop(d);/adddiskdtotower1X.TowersOfHanoi(n,1,2,3);,.,汉诺塔栈实现,voidmain(void)coutMovesforathreediskproblemareendl;TowersOfHanoi(3);,.,火车车厢重排问题,货运列车,n节车厢,编号1n经过车站n车站1,每站卸掉同号车厢在始发站重新排列车厢,使得车厢按编号排列每站卸掉最后一节车厢即可转轨站一个入轨、一个出轨、k个缓冲铁轨完成重排允许三种操作入轨缓冲轨缓冲轨出轨入轨出轨,.,图示,列车行进方向,.,我们试着自己总结出算法,初始:581742963,H1,H2,H3,.,继续,入:581742出:,H1,H2,H3,3,6,9,.,继续,入:581出:,H1,H2,H3,3,6,9,2,4,7,.,继续,入:5出:,H1,H2,H3,6,9,7,1234,8,.,重排算法,缓冲轨后进先出,用堆栈保存车厢号考虑在出轨顺序,必须栈底大,栈顶小依次检查入轨车厢编号如果出轨所需要的下一车厢,缓冲轨依次检查缓冲轨,若新来的栈顶,入栈如果=出轨所需要的下一车厢,出轨缓冲轨中车厢可能满足出轨需要,检查缓冲轨栈顶车厢,如有可能,出栈,出轨,不是一次,要反复做,直至栈中无满足出轨需要的车厢,.,重排程序,boolRailroad(intp,intn,intk)/ktrackrearrangementofcarorderp1:n./Returntrueifsuccessful,falseifimpossible./ThrowNoMemexceptionifinadequatespace./createstacksforholdingtracksLinkedStack*H;H=newLinkedStackk+1;intNowOut=1;/nextcartooutputintminH=n+1;/smallestcarinatrackintminS;/trackwithcarminH,k=?,为什么不是Stack?,.,重排程序(续),/rearrangecarsfor(inti=1;i=n;i+)if(pi=NowOut)/sendstraightoutcout“Movecar”pi“frominputtooutput”;coutendl;NowOut+;while(minH=NowOut)Output(minH,minS,H,k,n);NowOut+;,.,重排程序(续),else/putcarpiinaholdingtrackif(!Hold(pi,minH,minS,H,k,n)returnfalse;returntrue;,.,Output:缓冲铁轨出轨,voidOutput(int,.,Output:缓冲铁轨出轨,/findnewminHandminS/bycheckingtopofallstacksminH=n+2;for(inti=1;i=k;i+)if(!Hi.IsEmpty(),.,Hold:入轨缓冲铁轨,boolHold(intc,int/acarindex,.,Hold:入轨缓冲铁轨(续),for(inti=1;i=k;i+)if(!Hi.IsEmpty()/trackinotemptyx=Hi.Top();if(cx/nofeasibletrack,.,Hold:入轨缓冲铁轨(续),/addctobesttrackHBestTrack.Push(c);coutMovecarcfrominputtoholdingtrackBestTrackendl;/updateminHandminSifneededif(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玛丽波尔卡打击乐课件
- 市场监管放心码信息归集和公示规范编制说明
- 安全教育活动培训制度内容课件
- 狼和鸭子课件
- 高校青蓝工程方案(3篇)
- 电池碰撞实验工程方案(3篇)
- 牧场安全规范培训内容
- 农业品牌创新驱动:2025年资金申请战略研究报告
- 历年保研面试题库及答案
- 安全教育培训通知书课件
- 专业技术职务资格申报材料真实性承诺书
- 脓毒症指南课件
- 生产副总经理岗位职责标准版本(五篇)
- 对颈椎概念和命名的再认识
- 淀粉与变性淀粉知识
- 华为信息安全宣传
- 物业管理供方管理程序
- GB/T 37642-2019聚己内酯(PCL)
- GB/T 3730.2-1996道路车辆质量词汇和代码
- GB 25585-2010食品安全国家标准食品添加剂氯化钾
- 设计文件审核记录表(模本)
评论
0/150
提交评论