>  기사  >  백엔드 개발  >  PHP로 구현된 간단한 4가지 산술 연산 계산기 기능에 대한 설명 예

PHP로 구현된 간단한 4가지 산술 연산 계산기 기능에 대한 설명 예

jacklove
jacklove원래의
2018-07-06 17:44:052539검색

본 글에서는 PHP로 구현한 간단한 사칙연산 계산기 기능을 주로 소개하고, PHP로 구현한 표현식 계산 기능을 스택을 기반으로 예제 형태로 분석해 도움이 필요한 친구가 참고할 수 있습니다

본 글의 예시는 설명합니다. PHP 계산기 기능으로 구현된 간단한 4가지 산술 연산입니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

php는 간단한 4계산 계산기를 구현합니다(아직 괄호의 우선순위를 지원하지 않습니다). 표현식을 평가하기 위해 스택과 같은 데이터 구조를 사용하는 것이 좋습니다.

여기서 스택 구조를 사용할 수 있습니다. PHP의 배열은 "자연스럽게" 스택 특성을 가지므로 여기서는 배열을 직접 사용합니다. 물론 스택 구조를 사용하여 작성할 수도 있지만 원리는 동일합니다.

선배(폴란드 과학자)는 역폴란드 알고리즘(접미사 표현 방법)을 사용하여 괄호가 있는 4개의 표현식을 계산하고 있습니다. 정말 놀랍습니다! ! 사실 코딩은 어렵지 않습니다. 어려운 것은 알고리즘의 안내입니다. 코딩을 하기 전에 먼저 알고리즘을 이해해야 합니다.

<?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;
}

연산 결과:

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

PS: 추가 참조를 위해 권장되는 몇 가지 추가 계산 도구는 다음과 같습니다.

온라인 일변수 함수(방정식) 솔루션 계산 도구 :
http : //tools.jb51.net/jisuanqi/equ_jisuanqi

scientific 계산기 온라인 use_advanced 계산기 온라인 계산 :
http : //tools.jb51.net/jisuanqi/jsqkexue

온라인 계산기_표준 계산기:
http://tools.jb51.net/jisuanqi/jsq

관심을 가질 만한 기사:

Laravel 라우팅의 고정되지 않은 매개변수 수 구현 방법에 대한 관련 설명

Laravel 프레임워크 블레이드 템플릿 초보자 튜토리얼

PHP에서 생성된 품질이 낮은 썸네일을 해결하기 위한 코드 설명

위 내용은 PHP로 구현된 간단한 4가지 산술 연산 계산기 기능에 대한 설명 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.