栈的应用:表达式求值1.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

《数据结构课程设计实验一:表达式求值》

实验报告

一、简介

要求设计一个表达式求值的程序。该程序必须可以接受包含〔,〕,+,-,*,/,%,和^〔求幂运算符,a^b=ab〕的中缀表达式,并求出结果。如果表达式正确,那么输出表达式的结果;如果表达式非法,那么输出错误信息。

输入要求:

程序从“input.txt”文件中读取信息,在这个文件中如果有多个中缀表达式,那么每个表达式独占一行,程序的读取操作在文件的结尾处停止。

输出要求:

对于每一个表达式,将其结果放在“output.txt”文件的每一行中。这些结果可能是值〔精确到小数点后两位〕,也可能是错误信息“ERRORININFIXNOTATION”。

输入例子:

1+2+3-4

4.99+5.99+6.99*1.06

2^2.5^3

(5.6-2)%3

5%(3.2-2.1)

+1

输出例子:

2.00

18.39

50535.16

Errorininfixnotation.

Errorininfixnotation.

Errorininfixnotation.

输入的表达式是由操作数和运算符以及改变运算顺序的圆括号连接而成的式子。由于不同的运算符间存在优先级,同一优先级的运算间又存在着运算结合顺序的问题〔即左结合,还是右结合〕,所以简单的从左到右计算是不充分的。而后缀表达式〔后缀表达式是由一系列的运算符、操作数组成,其中运算符位于两个操作数之后,如123*+〕那么很容易通过应用栈实现表达式的计算,所以,我们要先把中缀表达式转换成后缀表达式,再进行计算。

二、算法说明

a、定义一个栈存放运算符,将中缀表达式转化为后缀表达式。

根本过程如下:

如果遇到空格,那么认为是分隔符,不需处理。

如遇到操作数,那么直接输出。

假设遇到左括号,那么将其压入栈中。

假设是遇到右括号,说明括号的中缀表达式已经扫描完毕,把括号中的运算符退栈,并输出。

假设遇到是运算符,当该运算符的优先级别大于栈顶运算符的优先级别时,那么将它压栈;当该运算符的优先级别小于栈顶运算符的优先级别时,那么将栈顶运算符退栈并输出,再次比拟新的栈顶运算符,按同样方法处理,直到该运算符大于栈顶运算符的优先级为止,然后将该运算符压栈。

假设中缀表达式处理完毕,那么要把栈中存留的运算符一并输出。

其中,不同运算符优先级的设置可以用一个数来代表其优先级,优先级越高,数值就越大。程序中,加减运算符的优先级是1,乘除法和取模运算符的优先级是2,求幂运算符的优先级是3,右括号是5,左括号是6,其他为0。运算符优先级关系如表1-1。.

b、转化后,用栈实现后缀表达式的计算。

其根本过程是:当输入一个操作数时,它被压入栈中,当一个运算符出现时,就从栈中弹出适当数量的操作数,对该运算进行计算,计算结果再压入栈中。对于常见的二元运算符来说,弹出的操作数只有两个。处理完整个后缀表达式之后,栈顶上的元素就是表达式的结果值。整个计算过程不需要理解运算的优先级规那么。

表1-1运算符优先级关系表

+

-

*

/

(

)

^

+

=

=

-

=

=

*

=

=

/

=

=

(

=

)

=

^

=

程序的整体算法过程分两步:

第一步,从“input.txt”文件中读取中缀表达式,并应用运算符栈OpHolder把中缀表达式转换为后缀表达式,将输出结果〔转换后得到的后缀表达式〕存放在一个temp文件中。

第二步,从temp文件中读取后缀表达式,并应用操作数栈Operands计算后缀表达式结果,将结果输出到“output.txt”文件中。

对于求幂运算要特别注意,例如2^3^3要变成223^,因为求幂运算符是从右到左结合的。

本程序中的栈采用前面所述的带头结点的链式存储结构,涉及两种类型:用于存储运算符号的char类型的链栈以及用于存储操作数的float类型的链栈。

Char类型的栈“Whereat”用来记录后缀表达式中操作数和运算符号的顺序,以及决定需要多少次运算。其中以A=Operand,B=Operator区分〔例如1+2转换成12+,再Whereat中的形式应该是AAB〕。

三、测试结果

四、结果分析与总结

该程序包括了许多可能出现的情况。测试包括正确的表达式,错误的表达式。因本程序曾加了输出分类局部,所以输出的结果包括了运算符错误,操作数错误,其他错误。

附录:源代码

/*将中缀表带式转换为后缀表达式*/

voidConvertToPost(FILE*In,StackWhereat,FILE*Temp)

{

StackOpHolder;

charholder;

charlastseen;

intdigitcounter=0

文档评论(0)

199****4744 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:7002121022000045

1亿VIP精品文档

相关文档