Home  >  Article  >  Backend Development  >  Implementation of simple four arithmetic operations calculator function in PHP

Implementation of simple four arithmetic operations calculator function in PHP

小云云
小云云Original
2017-12-11 09:58:553632browse

This article mainly introduces the simple four arithmetic operation calculator function implemented by PHP, and analyzes the expression operation function implemented by PHP based on the stack in the form of examples. Friends who need it can refer to it. I hope it can help everyone.

You can use the stack structure here. Since PHP's arrays "naturally" have stack characteristics, arrays are used directly here. Of course, you can use the stack structure to write, the principle is the same.

The senior (a Polish scientist) is calculating the four expressions with parentheses, using the reverse Polish algorithm (suffix expression method). Simply amazing! ! In fact, coding is not difficult. What is difficult is the guidance of the algorithm. You must first understand the algorithm before you can code.

<?php
$num_arr = array();// 声明数字栈
$op_arr = array();// 声明符号栈
$str = "10+6*2-18/2-2";
preg_match_all(&#39;/./&#39;, $str, $arr);// 把运算串分解成每个字符到$arr数组
$str_arr = $arr[0];
$length = count($str_arr);
$pre_num = &#39;&#39;;
// 开始入栈
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 = &#39;&#39;;
    }
  // 符号判断优先级,选择是否入栈
  } 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 &#39;<pre class="brush:php;toolbar:false">&#39;;
//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,&#39; = &#39;, $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==&#39;*&#39;) $re = $num1*$num2;
    if ($op==&#39;/&#39;) $re = $num2/$num1;// 这里注意顺序,栈是先进后出,所以$num2是被除数
    if ($op==&#39;+&#39;) $re = $num2+$num1;
    if ($op==&#39;-&#39;) $re = $num2-$num1;
    array_push($num_arr, $re);
  }
}
// 获取优先级
function priority($str){
  if ($str == &#39;*&#39; || $str == &#39;/&#39;){
    return 1;
  } else {
    return 0;
  }
}
// 判断是否是运算符
function isOper($oper){
  $oper_array = array(&#39;+&#39;,&#39;-&#39;,&#39;*&#39;,&#39;/&#39;);
  if (in_array($oper, $oper_array)){
    return true;
  }
  return false;
}

Run result:

10+6*2-18/2-2 = 11

Related recommendations:

PHP stack-based implementation of advanced calculator

php functional example of advanced calculator implementation (based on stack)

Detailed explanation of sample code for implementing online calculator function in PHP

The above is the detailed content of Implementation of simple four arithmetic operations calculator function in PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn