- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、问题分析和任务定义
实验问题:
算术表达式求值:一个算术表达式是由操作数(operand),运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始,结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。要求:(1)从键盘读入一个合法的算术表达式,输出正确的结果。(2) 显示输入序列和栈的变化过程。选作内容:操作数类型扩充到实数。
1、问题分析
在带括号的算术表达式中,界限符包括左右括号以及表达式起始、结束符“#”,如“# (7+15)*(23-28/4)#”。假设运算符只有加、减、乘、除4种,则对一个简单的算术表达式求值的运算规则如下:
(1) 从左至右运算表达式。
(2) 先乘、除,后加、减。
(3) 先括号内,后括号外。
为方便描述,将运算符和界限符统称为算符。这样,算符集有{+,-,*,/,(,),#}。要求:首先,能够读入一个算术表达式,判断表达式的合法性。其次,如果表达式是正确的,要能够输出一个正确的结果,并且显示具体实现的每步过程。
2、任务定义
要想能够实现这个问题,首先,你要从键盘中输入一个表达式,然后判别这个表达式的格式到底是不是正确的。这样,要想实现这个问题,可以先把所有不正确的表达式格式全都列举出来当作模板,然后将当前输入的表达式与该模板中各种情况进行一一比较,如果有相同的,则说明当前的表达式格式是不正确的,程序停止继续往下执行,询问是否重新输入,如果接着输入,需再次对输入的表达式进行判别,依照上步操作进行;如果不在输入就退出程序。
当输入的格式是正确的,就进入具体的求值过程。因为运算符和运算数具体处理的不同,这样,就要对运算符和运算数分别进行处理,不可放在一起,这样可以分别设置一个运算符栈和一个运算数栈来分别存储运算符和运算数。可以分为以下几步:a、将输入的表达式首先存储在一个一维数组里,然后每次读出一个字符。b、判别该字符是运算符还是运算数。如果是运算数就直接进运算数栈。如果是运算符,则与运算符栈的栈顶元素进行优先级的比较(可以单独写一个优先级比较函数,将每个运算符与其他运算符之间的优先级一一比较出来,可以设置为“”、“”、“=”),如果比较后为“”,则将运算数栈依次出栈两次,将该运算符和刚出栈的两个运算数进行计算(单独写一个函数,将“+”、“-”、“*”、“/”四种情况一一写出来),然后将计算的结果入运算数栈,将读入的运算符入运算符栈;如果比较后为“”,则将该运算符入运算符栈;如果是“=”,同“”,但要注意如果从运算符栈出栈的元素为“#”和“(”,则运算数栈无需出栈,并且运算符栈也无需入栈。按照上面的步骤,一一读完所有的字符。这样,运算数栈中最后剩下的元素就是该算术表达式的最终结果。
注意:整个算法结束的条件是运算符栈为空。(即表达式的起始、结束符相遇)
3、应该实现的功能
从键盘读入一个算术表达式,应能判别该表达式是否是正确的,如果是正确的,要能输出正确的结果,并能显示栈的变化过程和打印出正确的算术表达式。
4、测试用例
(1).输入:#(7+15)*(23-28/4)#
输出:
表达式的输入格式是正确的
该表达式的结果为:352
(2).输入:#(9+3)*(-5)#
输出:
表达式的输入格式是正确的
该表达式的结果为:-60
(3).输入:(9+3)
输出:表达式的结尾无“#”,格式不正确,无法求值!
是否继续求表达式的值?(“y”和“n” )
二、数据结构的选择和概要设计
1、数据结构的选择
因为一个算术表达式就是由运算符和运算数两部分构成的,表达式的求值过程就是对这两部分进行操作,并且由运算符的具体操作来控制运算数。所以为了方便操作,可以分别设置一个运算符栈 OPTR和一个运算数栈OPND,然后,通过对栈的具体操作来实现各种功能,但是这两个栈除了存储数据的类型不一样,具体的操作都是一样的。为了使程序更加简洁,可以设置一个函数模板,将运算符栈和运算数栈统一起来。同时,为了更加方便的对这两个栈进行各种操作,可以分别设置两个指针变量(*bottom和*top)分别指向栈底和栈顶和一个栈长变量(stacksize)。
函数模板的定义
template class T
class Stack
{
private:
T * bottom; //指向栈底
T * top; //指向栈顶
int stacksize; //栈长
public:
St
文档评论(0)