[理学]栈和队列--栈一.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[理学]栈和队列--栈一

堆栈和队列是数据结构的另外两种基本类型。从逻辑结构上看,堆栈和队列也是线性表,但它们是两种特殊的线性表。其特殊性在于,它们是运算受限的线性表,这里所说的运算是指对于数据的存取过程。堆栈的存取只能在堆栈顶端进行;队列则必须后端输入,前端输出。因此,堆栈和队列也被称为限定性的数据结构。 堆栈的运算规则是:后进先出(Last In First Out)。 队列的运算规则是:先进先出(First In First Out)。 1.1.2 栈的应用范围 1、子程序调用:跳往子程序前,先将主程序中的下一条指令地址存入堆栈。执行完子程序后,正好取出地址以回到主程序之中。 2、处理递归调用:与处理其它子程序类似,只是除了存储下一个指令的地址外,也将参数、局域变量等数据存入堆栈。 3、表达式的求值与转换:表达式求值是程序设计语言编译中的一个最基本的问题。是堆栈的一个最典型的应用。 4、二叉树的遍历:使用前序、中序、后序三种方式遍历二叉树,需要堆栈来依次放置节点。 5、图形的深度优先追踪法。 可见,堆栈对于递归子程序的调用、树和图的运算都适用。 堆栈的实际应用十分广泛,电脑硬件管理方面也大量使用堆栈概念,如堆栈缓冲区、堆栈存储区、堆栈网络等等。 假设栈的元素个数最大不超过正整数MaxSize,所有的元素都具有同一数据类型ElemType,则可用下列方式来定义顺序栈类型SqStack: typedef struct { ElemType data[MaxSize]; int top; /*栈指针*/ } SqStack; 堆栈应用过程中,常常会出现一个程序中需要同时使用多个堆栈的情形。使用数组这种静态的顺序存储结构模拟堆栈,为了控制堆栈的上溢,需要给每个堆栈分配一个较大的空间。有时候很难估计每个堆栈所需要的空间大小,并且还会出现一个栈上溢,而另外的栈尚留很多空间的情形。针对这种情况,我们还得寻求解决多个堆栈如何共享存储空间的问题。 比如程序中有两个堆栈,可以把两个栈底设在向量空间的两端,然后,各自向中间伸展,仅当两个栈顶相遇时才产生上溢。由此,两个堆栈就可以互补余缺,对于每个堆栈来说,可用的最大空间就不是整个空间的一半了。 但是对于多个堆栈,问题就复杂了。解决方法通常是让整个堆栈浮动,先将空间平均分配给每个堆栈,当整个空间未满而某个栈出现上溢时,再重新浮动分配(如重新等分空间)。 采用链表实现堆栈的存储结构,可以避免上述的麻烦。 (3)后缀表达式 前序表达式的特点是:运算符总在相关的一对运算单元之后。 ‘运算单元’为常量或表达式,若为表达式则以同样规则细化。 如:xyz-/,即为x/(y-z); AB/C+,即为A/B+C 同样由于不需要比较运算符的优先级,通常使用栈计算后序表达式只需要一个操作数堆栈(数值栈)存放操作数,待读到运算符时只需从操作数堆栈取出两个操作数参与运算即可。 计算机处理后序表达式最为简单,因此通常表达式的求值过程为:将读取到的中序表达式转换为后序表达式,然后对后序表达式求值。 int correct(char exp[],int n) { char st[MaxSize]; int top=-1,i=0,tag=1; while (in tag) { if (exp[i]==( || exp[i]==[ || exp[i]=={) /*遇到(、[或{,则将其入栈*/ { top++; st[top]=exp[i]; } if (exp[i]==‘)’) /*遇到‘)’,若栈顶是‘(’,则继续处 理, 否则以不配对返回*/ if (st[top]==() top--; else tag=0; if (exp[i]==‘]’) /*遇到‘]’,若栈顶是‘[’, 则继续处理,

文档评论(0)

jiupshaieuk12 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档