不知道有没有人看了上一篇文章后会有疑问,为什么转换后的表达式要存入表达式栈中呢?虽然在调试器中可以清楚的看到表达式被成功转换了,但如果想要输出的话,岂不是就是倒序了?其实我是在这部分埋下了一个小小的伏笔,我们转换为后缀表达式,是为了计算机能够计算我们输入的“字符串”形式的中缀表达式,而通过后缀法计算,也是要利用栈的,这次,我们还是用图来说话,以计算

1, 2, 3, 4, +, 5, *, +, 6, +, *

这个已经转化好的后缀表达式为例:

1.读入数字入栈

2.然后读入了一个运算符+,这时候就弹出栈中的两个数字,进行加法运算,然后再压回

3.还是继续读入数字

4.此时读入了运算符*,弹出两个数字,进行乘法运算,然后压回

5.再次读入一个加法运算符,弹出两个数字,进行加法运算,然后压回

6.读入数字

7.读入运算符加法,弹出两个数字,进行加法运算,然后压回

8.最后读入乘法运算符,将栈内最后两个数字弹出,进行乘法运算,压回。至此得到最终表达式的运算结果。

整个流程极其简单,只有当出现运算符的时候,才进行运算:

(1)弹出两个数字
(2)根据运算符进行运算
(3)压回运算结果

我们只要把这个过程嵌入我们之前的转换表达式的过程就能伴随着转换过程的结束,而得到计算的结果。
修改的方法主要是这样:

(1)把表达式栈改作双精度浮点型,只存储数字
(2)在每次读入运算符号的时候进行运算操作

有没有发现,合并了转换与运算的代码,反而更加简洁了呢?在符号运算的部分,我为什么要用left和right作为数字的标记呢?姑且留给读者们自行思考一下吧!
下面是代码:

说点什么

您将是第一位评论人!

  Subscribe  
提醒