数据结构第3章.pptVIP

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

if (!IsEmpty(*s)){ StackTop(*s,op2); Pop(s); /* 弹出栈顶操作数op2 */ } else{ result=FALSE; printf(\n Missing operand!); } if(result) switch (c){ /* 执行运算op2 c op1,并将运算结果进栈 */ case +: Push(s,op2+op1); break; case -: Push(s,op2-op1); break; case *: Push(s,op2*op1); break; case /: if (op1==0.0){ printf(\nDivide by 0!); Clear(s); } else Push(s,op2/op1); break; } else Clear(s); } void Eval(char exp[]) { char c;int op;int i; Stack s; CreateStack(s,Size); for(i=0,c=exp[i];c!=#;i++,c=exp[i]){ switch(c) { case +: case -: case *: case /:DoOperation(c,s); break; default: Push(s,c-0);break; } } if (!IsEmpty(s)) { StackTop(s,op); printf(\n The reshult is: %d\n,op); } } void main() { char exp[ExpSize]={6,4,2,-,/,3,2,*,+,#}; Eval(exp); } 从上面的讨论可知,无论是将中缀表达式转换成后缀表达式的算法,还是计算后缀表达式的值的算法,都需要借助一个堆栈。对于前者,堆栈中存放运算符(含左括号和#号),所以元素类型为字符型。对于后者,堆栈中存放操作数和中间计算结果,所以堆栈元素类型应为操作数类型(整型、实型等)。为同时实现这两个算法,在C语言下,我们需要设计两个Stack类型模块,它们具有不同的元素类型。另一种可能的方法使我们有可能使用同一个Stack结构类型,使得可在不同元素类型的情况下使用。其做法是:使用C语言提供void指针,将堆栈的元素的类型定义为void指针类型,该类型指针可指向不同具体类型的元素。例如我们可以将堆栈的元素类型定义为:typedef void* T;用void指针可实现类属Stack类型。在C++语言环境下,类属ADT可以用C++语言的模板(template)方便地实现。 3.4 递归和递归过程 3.4.1 递归的概念 递归(recursive)是一个数学概念也是一种有用的程序设计方法。在程序设计中为处理重复性计算最常用的办法是组织迭代循环。除此之外还可以采用递归计算的办法。特别是非数值计算领域中更是如此。递归本质上也是一种循环的程序结构,它把“较复杂”的计算逐次归结为“较简单”的情形的计算,一直归结到“最简单”的情形的计算并得到计算结果为止。许多问题可以采用递归方法来编写程序,一般来说,递归程序结构简洁而清晰,易于分析。数据结构也可以采用递归方式来定义。线性表、数组、字符串和树等数据结构原则上都可以进行递归定义。 1. 递归定义 说明递归定义的一个例子是斐波那契级数,它的定义可递归表示成 如果我们将实现队列的数组从逻辑上看成是一个头尾相接的环,就能充分利用数组空间来存储队列元素。图3-7显示了循环队列结构及其入队列和出队列运算的做法。初始状态下,我们将Front和Rear两指针均置成0。为了循环使用数组,我们利用取余运算符%计算新元素的插入位置,即新队尾元素的位置,以及计算删除队头元素后的新队头元素的位置。 队头指针进一操作:Front=(Front+1) % MaxQueue; 队尾指针进一:Rear=(Rear+1) % MaxQueue; 我们看到,指针Front和Rear始终以顺时针移动。 在循环队列结构下,当Front==Rear时为空队列,当(Rear+1) % MaxQueue==Front时被认为队列

文档评论(0)

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

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

1亿VIP精品文档

相关文档