计算器核心算法(一)

来源:互联网 发布:淘宝天下小二培训交钱 编辑:程序博客网 时间:2024/05/21 19:48

       我们大家都知道,我们在学习每一门语言的时候,基本上的人都写了计算器,那么你还记得你当时为了实现连加,连乘,连除,连减,多层括号是如何实现的么,如果你用了几十行就搞定了,那么你是高手,当然了,这里就是来介绍是如何实现的,这是我当时写计算器的时候采用的方法,如果喜欢记得点赞哦。。。


一.先实现没有括号的连加运算

2+5+6

上面是一个简单的等式,我们的任务就是能计算出它的结果,首先你看到这个你可能也会想到拆分,把每一个字符拆分到集合中,然后进行判断处理,但是今天只采用拆分,不采用集合


上面的等式可以拆分成 "2" "+" "5" "+" "6"


现在开始顺着我的思路走哦~~~


可以看到我定义了一个parse方法,我就像通过调用这个方法就能返回正确的结果,那么我们先实现最简单的一种

直接返回字符串的双精度的值,那么你们有疑问了,这有什么软用?不,我告诉你,这有用,-->它实现了一个字符串的数字转化成了一个真正的数字


可以看到这里顺利的完成了转化,现在不理解没关系,往下看

现在的这个方法就好像一个小孩子,它只认识字符串的数字

那么现在孩子慢慢长大,他遇到了加号+


这时候这个小孩子根本不会算,但是他发现他会算里面的一部分,也就是里面的"2"和"5"

于是这个小孩子把它拆出来,于是parse方法就多了一个判断,如下:


可以看到,它对加号前后进行了拆分,然后又调用自己,因为拆出来的是一个字符串的数字,这个孩子之前就已经认识它了,所以调用自己能算出结果,然后中间采用加号相加,这样子就实现了"2+5"

如果跟着写的亲们,自己就应该能发现,这里不仅实现了"2+5"还实现了"2+5+6+8"连加的功能,哇塞,好神奇啊发现,这是因为这个方法它发现加号就会拆分,所以"2+5+6+8" 就变成了"2" + "5+6+8" --> "2" + "5" + "6+8" -->"2" + "5" + "6" + "8"

这样子拆出来的每一个都是一个字符串的数字,所以都能算出来并且返回

这就是递归,很多时候递归确实只能靠自己想,我也很难给你们讲清楚,但是递归和while循环有一点是一样的,必须有一个条件是终止的,在递归里面就是必须有一个时候是要有确定返回值的,我们这里确定的返回值就是return Double.parseDouble(content);

大家好好理解一下,虽说代码就几句,但是里面意义还得靠大家自己仔细研究研究。好了话不多说,我们接下去分析


之前我们为什么拿"+"先作判断,这是因为加号两边的等式是可以先算出来的,不影响最后的结果,如果不懂,请回到小学课堂,听老师再给你念叨念叨~~~~


二.实现加减混合的计算

我们知道上面我们已经实现了连加,其实连减的道理也是一样的


图中标记出来的地方,如果代码走到了这里,说明等式里面已经没有"+"了,为什么呢,因为"+"上面有判断,如果存在就直接再if语句中返回了,所以走到了标记处等式中必须没有"+"号

"2-3+8-4"  那么如果现在的字符串是这样子的,会被拆分成"2-3" "+" "8-4"

加好两边还是调用parse方法,"2-3"这个等式就走到了标记的地方,然后现在这个方法不能算啊,除了加好不认识其他的,所以标记的地方又得做相同的判断了



可以看到做了一个和"+"号很类似的判断,只不过寻找减号的方法是lastIndexOf("-")   为什么是这个呢,因为最后一个减号前后的等式先计算这是不影响结果的

假如一个等式"8-2-6"    答案是0大家都是知道的,如果你弄成"8" - "2-6" 这就完全不一样了,这个值就变成了 8-(-4) -->8+4-->12

但是你按照最后一个减号前后拆分   "8-2" - "6"  -->   "6" - "6"  -->0答案是正确的!

所以就是这里不一样,其他还是和加号一样是自己调用自己,如此已经实现了连加连减的混合运算啦


可以看到都是没有问题的


三.实现连加连减连乘法


我们前面已经实现了连加连减,所以走到减号判断的下面的等式是没有加号和减号啦

走到箭头的标记处的等式是只有"*"和"/"啦,所以我们现在就实现对乘号的判断,原理一样,我就不解释了,直接上代码了



和加号一样,是不是很简单了?那么最后除号也一并解决吧

到这里已经实现了+-*/的混合等式的运算,而且代码量简直就是少的可怜,后面还是复制粘贴的,这里最关键就是让大家理解递归的思想,一个方法我比喻成一个小孩子,开始值认识一个字符串的数字,后来能认识"+",知道了拆分。。。。。然后成为了大人,成功学会了混合运算

这里我对代码进行测试

可以看到都是没有问题的,那么小金子我先吃饭啦,后面的括号的实现,容我吃完饭,下一个博客再给大家说哈

7 0
原创粉丝点击