PHP⽤函数实现四则运算,php怎么实现四则运算
php实现⼀个简单的四则运算计算器(还不⽀持括号的优先级)。利⽤栈这种数据结构来计算表达式很赞。
这⾥可以使⽤栈的结构,由于php的数组“天然”就有栈的特性,这⾥直接就利⽤了数组。当然可以使⽤栈结构写,道理⼀样的。
前辈(波兰⼀位科学家)在计算带有括号的四则表达式,利⽤逆波兰算法(后缀表达法)。简直神了!!其实代码code并不难,难的是算法的指导,要先理解算法,才能编码。
$num_arr = array();// 声明数字栈
$op_arr = array();// 声明符号栈
$str = "10+6*2-18/2-2";
preg_match_all('/./', $str, $arr);// 把运算串分解成每个字符到$arr数组php如何运行代码
$str_arr = $arr[0];
$length = count($str_arr);
$pre_num = '';
// 开始⼊栈
for($i=0; $i
$val = $str_arr[$i];
// 数字
if (is_numeric($val)){
$pre_num .= $val;// 兼顾下⼀个字符可能也是数字的情况(多位数)
if($i+1>=$length || isOper($str_arr[$i+1])){// 下⼀个是运算符或者到头了,则把数字塞进数字栈
array_push($num_arr, $pre_num);
$pre_num = '';
}
/
/ 符号判断优先级,选择是否⼊栈
} else if (isOper($val)){
if (count($op_arr)>0){
// 判断优先级,只要不⼤于符号栈顶的优先级,就开始计算,直到优先级⼤于了栈顶的,计算后才再把这个运算符⼊栈
while (end($op_arr) && priority($val) <= priority(end($op_arr))){
calc($num_arr, $op_arr);
}
}
array_push($op_arr, $val);
}
}
//echo '
';
//print_r($num_arr);
//print_r($op_arr);
// 计算栈⾥剩余的
while(count($num_arr)>0){
calc($num_arr, $op_arr);
if (count($num_arr)==1){
$result = array_pop($num_arr);
break;
}
}
echo $str,' = ', $result;
// 计算,获取数字栈的两个数,符号栈顶的运算符
function calc(&$num_arr, &$op_arr){
if (count($num_arr)>0){
$num1 = array_pop($num_arr);
$num2 = array_pop($num_arr);
$op = array_pop($op_arr);
if ($op=='*') $re = $num1*$num2;
if ($op=='/') $re = $num2/$num1;// 这⾥注意顺序,栈是先进后出,所以$num2是被除数if ($op=='+') $re = $num2+$num1;
if ($op=='-') $re = $num2-$num1;
array_push($num_arr, $re);
}
}
// 获取优先级
function priority($str){
if ($str == '*' || $str == '/'){
return 1;
} else {
return 0;
}
}
/
/ 判断是否是运算符
function isOper($oper){
$oper_array = array('+','-','*','/');
if (in_array($oper, $oper_array)){ return true;
}
return false;
}
运⾏结果:
10+6*2-18/2-2 = 11
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论