这一段时间上班不那么忙,于是在github上开始了自己的新的工程,也是我接下来一年的一个小目标吧。作为一个数学爱好者,自然想到在项目内做一个计算器试试手感,首先在code4app上找了一个,感觉不好看。
我忍了一段时间,后来有点忍不了了,就想着还是自己做一个吧。做出来UI效果不算很协调,稍微调一下颜色估计就好很多了。
之前我自己做过一次性运算的简易计算器,这次想着做好点的,自然要支持连续运算。过去对计算器的栈的算法总感觉理解的不透彻,花了两天时间弄完了算法和基础代码。
1.如何实现计算器
实现计算器一般会有两种方法:一种是使用前缀和后缀(中缀)表达式,一种是定义栈内和栈外的优先级。
我使用了第二种方法:
1)将输入的运算式转化为由运算符和运算数组成的数组;
- 准备好运算数的栈和运算符的栈;
3)依次读入数组中的元素,若是运算数则直接压入运算数栈,若是运算符则将该运算符的优先级和运算符栈顶元素优先级比较,有以下情况:
a)若前者大,则该运算符直接入栈;
b)若后者大,则弹出栈顶运算符,并弹出两个运算数,将运算结果压入运算数栈;
c)若两者相等,则两者抵消。
如此直到运算符栈清空,得到最后结果。
2.值得注意的地方
我在编程中习惯使用循环而极少使用递归,但是在这里的实现中使用while语句似乎是必然的选择。
栈内栈外的优先级也有些意思的。括号在平时的计算中拥有最高优先级,然而表达式有左右括号之分,故不得不将一个括号优先级设为最低,另一个设为最高(它们在栈内栈外对立时必须优先级相等)。加减号优先级本来相等,但是显然栈内运算优先,故一般运算符栈内优先级高1。
这个计算器只是实现了基本思路,比如负号,除以零处理等等都还没来得及做,以后会补上。
其实这些内容大学内就该研究透,可惜那时编程基础太差,没多大兴趣。现在有时间尽量去补充自己。
我的项目还在构思中,就是一个实现自己思路的地方。若有兴趣和需要可以去看看:https://github.com/VagrantZXC/StarDeProject