思路:首先遍历整个运算符数组,如果有优先级高的运算符就将它弹出,然后在数字数组中弹出响应的数字。最后运算得到结果,删除这个运算符,然后将这个结果数压到对应的位置上
function calcFromExp($numbers, $ops){
while( (in_array("*", $ops)) || (in_array("/", $ops)) ){
echo "sign * and / calc
";
for($i = 0; $i < count($ops); $i++){
if(strcoll("*", $ops[$i]) == 0){
array_splice($ops, $i, 1);
$temp = $numbers[$i] * $numbers[$i + 1];
array_splice($numbers, $i+1, 1);
$numbers[$i] = $temp;
}else if(strcoll("/", $ops[$i]) == 0){
array_splice($ops, $i, 1);
$temp = ($numbers[$i] / $numbers[$i + 1]);
array_splice($numbers, $i+1, 1);
$numbers[$i] = $temp;
}else{
//如果不是*,/号那么就使i++。(刚开始,卡在这里,如果第一个运算符不是*,/,那么就会进入到死循环的模式)
continue;
}
break;
}
}
print_r($ops);
//print_r($numbers);
while( (in_array("+", $ops)) || (in_array("-", $ops)) ){
echo "sign * and / calc
";
for($i = 0; $i < count($ops); $i++){
if(strcoll("+", $ops[$i]) == 0){
array_splice($ops, $i, 1);
$temp = $numbers[$i] + $numbers[$i + 1];
array_splice($numbers, $i+1, 1);
$numbers[$i] = $temp;
}else if(strcoll("-", $ops[$i]) == 0){
if($numbers[$i] < $numbers[$i + 1]){
$numbers[$i] = $numbers[$i] + $numbers[$i + 1];
$numbers[$i + 1 ] = $numbers[$i] - $numbers[$i + 1];
$numbers[$i] = $numbers[$i] - $numbers[$i + 1];
}
echo "
".$numbers[$i].".wwwww".$numbers[$i]."
";
array_splice($ops, $i, 1);
$temp = ($numbers[$i] - $numbers[$i + 1]);
array_splice($numbers, $i+1, 1);
$numbers[$i] = $temp;
}else{
//如果不是*,/号那么就使i++。(刚开始,卡在这里,如果第一个运算符不是*,/,那么就会进入到死循环的模式)
continue;
}
break;
}
}
return $numbers; //其中返回的数组的第一个就是最后的结果
}
$numbers = array(1,2,3);
$ops = array("-","*");