Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are+,-,*,/. Each operand may be an integer or another expression.
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
在做这个题目之前,我们先了解一下什么是逆波兰式?
我们平常人类常用的计算方式(1+2)*(3+4)-(5*6)是中缀表达式,这种表达式对我们来说很简单,但是对计算机来说却很复杂。
所以转化成计算机喜欢的逆波兰式,上面的例子转化为逆波兰式则为
->"(1+2)*(3+4)","(5*6)","-"
->"(1+2)","(3+4)","*","5","6","*","-"
->"1","2","+","3","4","+","*","5","6","*","-"
这种算式需要采用栈式结构进行计算,先进后出。
<?php
function evalRPN($arrElement) {
$arrStack = array();
$output = 0;
foreach($arrElement as $element) {
switch ($element) {
case '+' :
$first = array_pop($arrStack);
$second = array_pop($arrStack);
$output = $second + $first;
$arrStack[] = $output;
break;
case '-' :
$first = array_pop($arrStack);
$second = array_pop($arrStack);
$output = $second - $first;
$arrStack[] = $output;
break;
case '*' :
$first = array_pop($arrStack);
$second = array_pop($arrStack);
$output = ($second * $first);
$arrStack[] = $output;
break;
case '/' :
$first = array_pop($arrStack);
$second = array_pop($arrStack);
$output = $second / $first;
$arrStack[] = $output;
break;
default :
$arrStack[] = intval($element);
break;
}
}
return intval($output);
}
$arrElement = ["4", "13", "5", "/", "+"];
$num = evalRPN($arrElement);
print $num;