概述
1. 简介
逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)
2. 例子
我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+
下列例子,左侧为中缀,右侧为后缀即逆波兰式
- (1 + 3) / 4 => 1,3,+,4,/
- ((2 * 3) + 4) * 5 => 2,3,*,4,+,5,*
4. PHP 实现
- 逆波兰式可以很简单的通过
入栈
和出栈
两种操作即可完成包含加减乘除
的普通表达式运算,具体为stack1
和stack2
两个栈,逆波兰式放入 s1,然后逐一取出其中元素,如果是数字则入 s2,如果运算符,则从 s2 取出两个进行运算,将结果入 s2,重复上述操作到整个完成即可,用array_shift
和array_unshift
模拟入栈
和出栈
动作,代码如下:
function evalRPN2($tokens) {
$data=[];
$type=['+','-','*','/'];
for($i=0;$i<count($tokens);$i++) {
if(!in_array($tokens[$i],$type)) {
array_unshift($data,intval($tokens[$i]));
}else{
$val1=array_shift($data);
$val2=array_shift($data);
switch($tokens[$i]) {
case '+':
array_unshift($data,$val2+$val1);
break;
case '-':
array_unshift($data,$val2-$val1);
break;
case '*':
array_unshift($data,$val2*$val1);
break;
case '/':
array_unshift($data,intval($val2/$val1));
break;
default:
}
}
}
return current($data);
}
- 另外是通过递归,首先取出最后一位的操作符,然后取出前一位元素,数字则存为待运算的数字,操作符则将剩余逆波兰式进行递归,直到取出其中所有元素为止,代码如下:
function evalRPN(&$tokens) {
if (sizeof($tokens) > 1) {
$operator = array_pop($tokens);
$second = end($tokens);
if (in_array($second, ['+', '-', '/', '*'])) {
$value = evalRPN($tokens);
$second = $value;
} else {
$second = array_pop($tokens);
}
$first = end($tokens);
if (in_array($first, ['+', '-', '/', '*'])) {
$value = evalRPN($tokens);
$first = $value;
} else {
$first = array_pop($tokens);
}
switch ($operator) {
case '+':
$value = $first + $second;
break;
case '-':
$value = $first - $second;
break;
case '/':
$value = intval($first / $second);
break;
case '*':
$value = $first * $second;
}
} else {
$value = array_pop($tokens);
}
return $value;
}
最后
以上就是长情大地为你收集整理的逆波兰表达式的 PHP 实现的全部内容,希望文章能够帮你解决逆波兰表达式的 PHP 实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复