PHP에서 간단한 4가지 산술 연산 계산기 기능 구현

小云云
풀어 주다: 2023-03-17 21:00:02
원래의
3596명이 탐색했습니다.

이 글은 PHP로 구현한 간단한 사칙연산 계산기 기능을 주로 소개하고, 스택을 기반으로 PHP로 구현한 표현식 계산 기능을 예제 형태로 분석해서 필요한 친구들이 참고하면 좋겠습니다. .

여기서 스택 구조를 사용할 수 있습니다. 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
로그인 후 복사

관련 권장 사항:

스택을 기반으로 구현된 PHP 고급 계산기

고급 계산기를 구현하는 PHP의 기능 예(스택 기반)

PHP에서 온라인 계산기 기능을 구현하기 위한 샘플 코드에 대한 자세한 설명

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!