我们继续探讨更复杂的运算公式,带小括号()、中括号[]、大括号{}的计算公式。
6*{8-[(90-78)+60]-45}
怎么去解决公式里的()、[]、{},楠神首先想到的解决方案是使用递归。
看图解:
通过上图的分解,我们把 6*{8-[(90-78)+60]-45} 分解成了90-78 =》 12+60 =》 8-72-45 =》 6*(-109)
每一个公式的结果又是下一个公式需要用到的数字,符合递归的规律。
那我们开始写代码:
先在栈类添加一个静态方法:
为了方便大家理解,楠神不对函数calculator做改动了,重新定义一个新函数calculator2。
函数calculator代码已经很多了,在实际开发中最好不要这样(函数的代码和注释不宜超过100行),一定要把一个函数简化成多个函数。好处不言而喻:代码易于重复利用减少整个项目的代码量,可读性高,可拓展性高,可维护性高。
换成calculator2函数
看结果:
好像是出错了,到底是怎么回事呢?我们用var_dump函数打印下
原来是这个地方“6*-109”出错了,变成了不正确的表达式了,到底是怎么回事?
我们在123行在打印下$ch变量。
122行的$ch变量的值当为-109时,在139行被强制转成了“6*-109”。对于calculator函数这是错误的公式字符串,没办法,我们还得去修改下这两个函数。
calculator2函数改动:
多加了一行代码,第124行。“6*-109”会变成“6*(-109)”。
calculator函数改动:
1.把原来的while循环改成了for循环。
2.19行——32新添加的代码,用来获取括号里的负数,并入数字栈。
这次完全正确。
结束语:
用“栈”这种数据结构实现计算器的功能到此彻底结束了,目的是让大家了解“栈”这种数据结构和练习编写程序的能力。感兴趣的朋友还可以在楠神的代码之上继续做拓展,比如去掉公式字符串中的空格。
如果代码实在不好理解,就放弃吧,这节课不影响我们后面的课程,像计算器这样的功能在PHP开发中是不会遇到的。不仅仅是“栈”、“链表”,PHP开发中也很少用到数据结构,好多东西都包装好了,拿来用即可。
虽用不到数据结构,可我们还是要对数据结构有个大体了解的,这样程序员才是有水平的程序员,才能写出好的程序。