- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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),用来分别存放表达式中的操作数和运算符。开始时操作数栈为空,运算符栈中放入一个特殊的标志运算符号 #号,并在表达
您可能关注的文档
- 标韩一册语法总结、称谓、结构.docx
- 标题】汽车货物运输规则.docx
- 标高测量记录.docx
- 栈桥施工安全培训.docx
- 栈和队列实验报告.docx
- 栈桥设计说明.docx
- 栉风沐雨勇攀新高峰---车间职代会报告.docx
- 栈的基本结构和操作(c语言实现).docx
- 栏杆扶手安装合同.docx
- 树型金银花标准化高效有机栽培技术研究与示范.docx
- 沪科版九年级上学期期末考试化学试卷-附带答案.docx
- 七年级数学下册《二元一次方程》单元检测卷及答案(苏科版).docx
- 八年级数学上册《第十一章与三角形有关的线段》同步练习题及答案-(人教版).docx
- 九年级数学上册《第二十二章 相似》单元测试卷及答案(沪科版).docx
- 七年级数学下册《认识三角形》练习题及答案解析(北师大版).docx
- 八年级数学下册《多边形内角和》练习题及答案解析(沪科版).docx
- 八年级数学上册《第十三章 轴对称》单元检测卷及答案(人教版).docx
- 八年级数学上册《第十二章角平分线的性质》同步练习题及答案(人教版).docx
- 七年级数学下册《第二单元》单元检测卷及答案(沪科版).docx
- 八年级数学上册《第十三章轴对称》单元测试卷及答案(人教版).docx
文档评论(0)