一、一个简单的算术表达式(8*(7-2))
给出一个算术表达式“(8*(7-2))”,我们很快可以口算出来结果是40。如果把这条式子扔给java计算,结果如何?如果不对这条表达式作任何处理,java或者其他计算机语言都只是把它当做是一个简单的字符串,java不会像人那样认识加减乘除、括号内优先计算等操作,如果真要编程语言算出人类的算术表达式的结果,只能去解析这个表达式,把它解析成编程语言自己能读懂的方式然后去计算结果。
二、Dijkstra双栈算术表达式求值
这个问题很久以前就有个解决方案:Dijkstra双栈算术表达式求值。顾名思义,双栈就是两个栈(stack),用两个栈来实现算术表达式的值。
这个算法有如下几个步骤:
1、建立两个栈:操作符栈(opt)、操作数栈(values);
2、将给出的表达式从左到右逐个字符扫描,遇到左括号则忽略;
3、遇到“加减乘除”则压入opt,否则压入values;
4、遇到右括号,opt、values分别弹出一个元素;
5、再从values弹出,与第四步中弹出的操作数和操作符做运算;
6、把第五步的运算结果压入values;
7、循环以上步骤直到表达式结尾;
8、输出最后计算结果。
可以发现,每次经过第5步后values里只剩下一个操作数,这个操作数就是一个“()”