栈的应用举例.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
栈的应用举例(栈与表达式) [引言] 处理表达式是高级语言的编绎中的一个基本问题。 它的实现是栈的一个重要应用,通过 对处理表达式的讨论,可以帮助我们进一步了解栈的性能。 [内容讲授] 栈在计算机科学领域有着广泛的应用。 比如在编译和运行计算机程序的过程中, 就需要 用栈进行语法检查(如检查 begin和end、“(”和“)”等是否匹配)、计算表达式的值、实 现过程和函数的递归调用等。下面举例说明栈在这些方面的应用。 例1、 假设一个表达式有英文字母(小写) 、运算符(+, —, *,/)和左右小(圆)括号 构成,以“ @”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号 是否匹配,若匹配,则返回“ YES”;否则返回“ NO”。表达式长度小于 255,左圆 括号少于20个。 分析:假设输入的字符串存储在 c中(var c:string[255])。 我们可以定义一个栈: var s:array[1..maxn] of char;top:integer; 用它来存放表达式中从左往右的左圆括号。 算法的思路为:顺序(从左往右)扫描表达式的每个字符 c[i],若是“(”,则让它进 栈;若遇到的是“)”,则让栈顶元素出栈;当栈发生下溢或当表达式处理完毕而栈非空时, 表示不匹配,返回“ YES”,否则表示匹配返回“ NO”。 程序代码如下: var c:stri ng; function doit(c:stri ng):boolea n; var s:array[1..20] of char; top,i:i nteger; ch:char; begin top:=0; i:=1;ch:=c[i]; while ch@ do begin if (ch=() or (ch=)) then case ch of (:begi n top:=top+1;s[top]:=( end; ):if top0 then top:=top-1 else begi n doit:=false;exit end; en d; i:=i+1;ch:=c[i]; en d; if top=0 the n doit:=true else doit:=false; end; begin assign(input,in.txt); reset(input); readln(c); writeln(doit(c)); close(input); end. [ 补充 ] 关于表达式的三种表示法。 1、 中缀表达式: a+b 2、 后缀表达式: ab+ 3、 前缀表达式: +ab 4、 中缀转后缀的方法及举例转换: 一般方法:把每个运算符移到它的两个运算数后面,每个运算数后多加上一个空格 (为了分隔各个运算数) ,然后去掉所有括号即可。如: 3/5+6 3口 5□ /□ 6口 + { □表示空格,下同} 16-9* (4+3) 19口 9 □ 4口 3口 +*- 2*(x+y)/(1-x) 2口 x □ y口 +*1 □ x □ -/ (25+x)*(a*(a+b)+b) 25口 x □ +a口 a口 b □ +*b □ +* 另外一种手工方法:可以用后面讲到的二叉表达式树结合先序、中序和后序遍历。 5、 中缀表达式的运算规则比较多,包括优先级、左右次序和括号;尤其是括号可以改 变优先顺序,这就只能在计算的每一步,用肉眼去扫描、观察和比较整个表达式中 谁的优先级高, 就先计算那部分。 但用计算机去做就很麻烦, 而且效率不高。 所以, 计算机科学中是把中缀表达式先转换成后缀表达式, 在利用计算机来计算后缀表达 式的值。后缀表达式又称“逆波兰式” ,在后缀表达式中,不存在括号,也不存在 优先级的差别,计算过程完全按照运算符出现的先后顺序进行, 整个计算过程仅需 一遍扫描即可完成。 6、 两个任务: ( 1 )把中缀表达式转换成后缀表达式; (2)求后缀表达式的值; 例 2、输入一个中缀表达式,编程输出其后缀表达式,要求输出的后缀表达式的运算次序与 输入的中缀表达式的运算次序相一致。为简单起见,假设输入的中缀表达式由+(加) 、- (减)、x(乘)、/(除)四个运算符号以及左右圆括号和大写英文字母组成,其中算术运 算符遵守先乘除后加减的运算规则。假设输入的中缀表达式长度不超过 80 个字符,且都是 正确的, 即没有语法错误, 并且凡出现括号其内部一定有表达式, 即内部至少有一个运算符 号。以下是一个运行实例。 输入: X+A*( Y-B) -Z/F 输出: XAYB-*+ZF/- [ 算法设计 ] 设置两个栈:操作数栈(OVS )和运算符栈(ops),用来分别存放表达式中的操作数和 运算符。开始时操作数栈为空,运算符栈中放入一个特殊的标志运算符号 #号,并在表达

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档