Github上的代码提交
解题思路
对负号的处理
这次作业我进行的第一步便是对负号的处理。我们知道在算术表达式‘ - ’有两种意思,一种是表示减号,另外一种是表示其后的数字为负数。于是我对我之前的scan类代码进行了修改加入了对‘ - ’的特判。我首先是分为‘ - ’在首位和不在首位进行特判,若‘ - ’在首位且其后一位为数字则‘ - ’为负号。然后对于‘-’不在首位的情况进行分析,发现仅当‘ - ’的后一位为数字且前一位为符号时‘ - ’表示负号。这样对负号便处理完成。
优先级处理
接下来我就开始学习优先级的处理方式了,我觉得这也是这次作业的核心,我刚刚接触的时候真的感觉非常无力不知道从哪里入手,然后通过百度各种资料再加上同学的讲解我终于理解了。核心思想大致是输入中缀表达式,然后直接求值。首先,我们要了解四则运算的规则:(1) 先乘除,后加减 (2) 从左到右 (3) 先括号内,后括号外 于是根据四则运算的规则在运算的每一步,任意两个相继出现的算符之间的优先关系有3种‘ > ’、‘ < ’、‘ = ’。
算术表达式求值的实现
算术表达式求值的算法实现步骤大致是:
(1)使用两个栈,分别存放操作符和操作数。
(2)置操作数栈为空,起始符#入运算符栈。
(3)依次读入表达式中的每个字符,如是操作数,入操作数栈;如是运算符,和运算符栈顶符号比较优先权。直到表达式求值完毕,即##配对。
(4)若优先权比较结果为‘ < ’,则运算符入栈,若为‘ = ’,则运算符两两配对取出删除,若为‘ > ’,则取出数字栈前两个数字进行四则运算
(5)若 ## 配对说明计算完成,此时剩下的唯一数字便是计算结果
作业心得
这次作业我第一次看到题目的时候一点思路都没有,然后就把网页关上了。后来过了一两天,我问了一个有思路的同学他大概是怎么想的,然后推荐我上网查算数表达式求值的相关资料,然后我回去学习了算数表达式求值的几种基本方法。后来他又用实例告诉我具体的应该如何理解这个算法。大致思路在上面的解题思路中呈现出来了,接下来就是用代码实现的部分,这时候我才发现天呐思路虽然基本明白但是用代码实现却比想象中复杂的多,我先是自己打了两个晚上发现还是有些地方没法成功实现,比如其中有个要将字符串转化为数字的部分等等,然后我又开始请教大神了,问了一波之后终于解决了这些问题,眼看着我的代码就要完成啦~~ 可是编译一直过不去,就是到处都有一些小小的bug,我又花了一晚上 解决了这些bug,通过了编译,可是发现我的代码没法实现题目的要求,我就接着修改啊修改啊最后还是有一点问题....心好累找不出来了..希望有大神能帮帮我。然后这次作业也让我收获到很多,除了更加多了解到C++的一些用法和知识点也让我更加巩固了类的使用。