第八章:第16节 PHP数据结构与算法——栈的强化学习(三)

更新于:2017-07-05 21:50:19

我们继续探讨更复杂的运算公式,带小括号()、中括号[]、大括号{}的计算公式。


6*{8-[(90-78)+60]-45}


怎么去解决公式里的()、[]、{},楠神首先想到的解决方案是使用递归


看图解:


1.png

通过上图的分解,我们把 6*{8-[(90-78)+60]-45} 分解成了90-78 =》 12+60 =》 8-72-45 =》 6*(-109)


每一个公式的结果又是下一个公式需要用到的数字,符合递归的规律。


那我们开始写代码:


先在栈类添加一个静态方法:

1.png


为了方便大家理解,楠神不对函数calculator做改动了,重新定义一个新函数calculator2。


函数calculator代码已经很多了,在实际开发中最好不要这样(函数的代码和注释不宜超过100行),一定要把一个函数简化成多个函数。好处不言而喻:代码易于重复利用减少整个项目的代码量,可读性高,可拓展性高,可维护性高。


1.png

1.png

换成calculator2函数

1.png

看结果:

1.png

好像是出错了,到底是怎么回事呢?我们用var_dump函数打印下

1.png

1.png

原来是这个地方“6*-109”出错了,变成了不正确的表达式了,到底是怎么回事?

1.png

我们在123行在打印下$ch变量。

1.png

122行的$ch变量的值当为-109时,在139行被强制转成了“6*-109”。对于calculator函数这是错误的公式字符串,没办法,我们还得去修改下这两个函数。


calculator2函数改动:

1.png

多加了一行代码,第124行。“6*-109”会变成“6*(-109)”。


calculator函数改动:

1.png

1.png

1.png

1.把原来的while循环改成了for循环。

2.19行——32新添加的代码,用来获取括号里的负数,并入数字栈。


1.png

这次完全正确。


结束语:


用“栈”这种数据结构实现计算器的功能到此彻底结束了,目的是让大家了解“栈”这种数据结构和练习编写程序的能力。感兴趣的朋友还可以在楠神的代码之上继续做拓展,比如去掉公式字符串中的空格。


如果代码实在不好理解,就放弃吧,这节课不影响我们后面的课程,像计算器这样的功能在PHP开发中是不会遇到的。不仅仅是“栈”、“链表”,PHP开发中也很少用到数据结构,好多东西都包装好了,拿来用即可。


虽用不到数据结构,可我们还是要对数据结构有个大体了解的,这样程序员才是有水平的程序员,才能写出好的程序。


本节学习代码》》》