Home  >  Article  >  Backend Development  >  Example explanation of simple four arithmetic operation calculator functions implemented in PHP

Example explanation of simple four arithmetic operation calculator functions implemented in PHP

jacklove
jackloveOriginal
2018-07-06 17:44:052431browse

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

The examples in this article describe A simple four-arithmetic calculator function implemented in PHP. Share it with everyone for your reference, the details are as follows:

php implements a simple four-arithmetic calculator (it does not yet support the priority of parentheses). It's great to use a data structure like a stack to evaluate expressions.

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

PS: Here I would like to recommend several calculation tools for your further reference:

Online one-variable function (equation) solving calculation tool:
http://tools.jb51.net/jisuanqi/equ_jisuanqi

Scientific calculator online use_Advanced calculator online calculation:
http:/ /tools.jb51.net/jisuanqi/jsqkexue

Online Calculator_Standard Calculator:
http://tools.jb51.net/jisuanqi /jsq

Articles you may be interested in:

Related explanations on how to implement an unfixed number of parameters in Laravel routing

Laravel Framework Blade Template Beginner Tutorial

Explanation of the code to solve the poor quality of php generated thumbnails

The above is the detailed content of Example explanation of simple four arithmetic operation calculator functions implemented 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