今天在搜索PHP算法的时候,无心间进入了知乎,有人问,PHP须要算法?有人说须要,有人说不须要,这里不说结论,只谈看到的一个回复,里面提到了逆波兰表达式,我搞PHP一年了仍是第一次听到这个词(原谅我不是计算机专业,算法知识也很弱,正在学习中),以为很新鲜,因此想分享一下!web
逆波兰表达式又称后缀表达式,它的解释器通常都是基于堆栈的,操做数入栈,遇到操做符时,操做数出栈,求值,将结果入栈;写法是运算符在数字的后面,表达式中无需使用小括号"()",运算顺序也清楚明了,如中缀表达式1 + 2用逆波兰表达式则为 1 2 +,中缀表达式1 + 2 * 3用逆波兰表达式则为 1 2 3 * +,PS:在搜索中缀表达式时,看到百度百科的词条里面好像有错误,理解了这个例子能更好的理解逆波兰表达式,以下图(截图时间是2015-08-30 20:40):算法
它举了一个例子:中缀表达式8 + 4 - 6 * 2(=0)用逆波兰表达式则为6 2 * 8 4 + -(=0),按照这个逆波兰表达式,若是转为中缀表达式实际上是(6 * 2) - (8 + 4)(=0),计算结果没有问题,但计算顺序错误。若是把中缀表达式换为8 + 4 - 6 * 3(= 负6),按照图中写法逆波兰表达式则为6 3 * 8 4 + -(= 正6),因此正确写法应是8 4 + 6 2 * - 或是8 4 + 6 3 * -(若是有理解不对的地方,请快速提醒我,以避免误导他人)。学习
逆波兰表达式的优势(摘自维基百科,自由的百科全书):
google
用于表达式求值,以利用堆栈结构和减小计算机内存访问。url
当有操做符时就计算,所以,表达式并非从右至左总体计算而是每次由中心向外计算一部分,这样在复杂运算中就不多致使操做符错误。spa
堆栈自动记录中间结果,这就是为何逆波兰计算器能容易对任意复杂的表达式求值。与普通科学计算器不一样,它对表达式的复杂性没有限制。ip
逆波兰表达式中不须要括号,用户只需按照表达式顺序求值,让堆栈自动记录中间结果;一样的,也不须要指定操做符的优先级。逆波兰计算器中,没有“等号”键用于开始计算。内存
逆波兰计算器须要“确认”键用于区分两个相邻的操做数。get
机器状态永远是一个堆栈状态,堆栈里是须要运算的操做数,栈内不会有操做符。百度
教育意义上,逆波兰计算器的使用者必须懂得要计算的表达式的含义。