看了某些csdn博客的计算器带括号优先级算法并不能很好地处理复杂的算式。这里自己就写了一个可以处理复杂算式的算法。
我的思路:递归
先看下面这个算式:
String s5="(343+5757/3*(787-45+780)-9*233+(787+909-(32*7))*555/(7+88*565-99))";
运算结果:
如何让算法智能地算出这个字符串的结果呢?
先想想我们在碰到这种算式时是怎么开始的,首先,我们会找到这个算式的优先级,比如我们更希望先得到787-45+780的结果,再让这个结果乘上3,同样,我们更希望得到32*7的结果后再让909减去它。所以同样的道理,如果有n级括号,我们理所当然地希望先得到最里面的结果,再把结果返回给上一层,并参与上一层的运算
比如下面的例子:
按照上面的流程,我们只需从第5层开始,按照箭头的逆方向分别返回结果并和上一层的数字相运算,以此类推,最终我们便能得到结果。
那么我们该怎么开始呢?虽然我们看流程已经知道可以用递归实现,但是我们应该怎么选择,怎么封装,需要哪些工具方法才能帮助我们实现呢?我们发现,如果仅仅是用递归处理字符串是完全不够的,因为至少一个字符串不能智能地拆分成多个子字符串,那么有人就会想可以定义一个方法处理字符串得到多个子字符串,但是这样的话参数又不匹配了,传的是一个String,但是我们得到的却又是String[],那么有人又说可以把一个String装成数组传进去,再用方法得到多个String,再。。。好吧,虽然可能能实现,但是肯定会比较复杂,说不定人就晕了。
选择方式:如果我们仔细观察上面的流程话就会发现有些类似的地方-----java的File类
每一个File都能listFile出一堆File,这不正好和流程图有着异曲同工之妙吗?所以我们第一要做的就是封装类
这里自己写了个类叫做WiseString,意为智能的字符串,下面先看WiseString类一个主要的函数,该函数用来把一个WiseString按加减法或者乘除法分割成同等级的若干 子WiseString(即表达式,如把(3+4-5)/3+2*6*7-999分成(3+4-5)/3,2*6*7和999)