이 글은 PHP로 구현한 간단한 사칙연산 계산기 기능을 주로 소개하고, 스택을 기반으로 PHP로 구현한 표현식 계산 기능을 예제 형태로 분석해서 필요한 친구들이 참고하면 좋겠습니다. .
여기서 스택 구조를 사용할 수 있습니다. PHP의 배열은 "자연스럽게" 스택 특성을 가지므로 여기서는 배열을 직접 사용합니다. 물론 스택 구조를 사용하여 작성할 수도 있지만 원리는 동일합니다.
선배(폴란드 과학자)는 역폴란드 알고리즘(접미사 표현 방법)을 사용하여 괄호가 있는 4개의 표현식을 계산하고 있습니다. 정말 놀랍습니다! ! 사실 코딩은 어렵지 않습니다. 어려운 것은 알고리즘의 안내입니다. 코딩을 하기 전에 먼저 알고리즘을 이해해야 합니다.
<?php $num_arr = array();// 声明数字栈 $op_arr = array();// 声明符号栈 $str = "10+6*2-18/2-2"; preg_match_all('/./', $str, $arr);// 把运算串分解成每个字符到$arr数组 $str_arr = $arr[0]; $length = count($str_arr); $pre_num = ''; // 开始入栈 for($i=0; $i<$length; $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 '<pre class="brush:php;toolbar:false">'; //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
관련 권장 사항:
PHP에서 온라인 계산기 기능을 구현하기 위한 샘플 코드에 대한 자세한 설명
위 내용은 PHP에서 간단한 4가지 산술 연산 계산기 기능 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!