> 백엔드 개발 > PHP 튜토리얼 > PHP 역 폴란드 급여 계산 예

PHP 역 폴란드 급여 계산 예

*文
풀어 주다: 2023-03-18 16:12:02
원래의
1346명이 탐색했습니다.

PHP에서 급여 계산에 역 폴란드어를 사용하는 방법. 본 글에서는 주로 역폴란드 알고리즘을 이용한 PHP의 임금 계산 방법을 소개하고, PHP 역폴란드 알고리즘의 원리와 관련 활용법을 사례를 통해 분석한다. 그것이 모두에게 도움이 되기를 바랍니다.

이 기사의 예에서는 PHP에서 역폴란드 스타일을 사용하여 급여를 계산하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.

일반 중위 표현식을 역 폴란드 표현식으로 변환하는 일반적인 알고리즘은 다음과 같습니다.

먼저 스택 2개를 할당해야 합니다. 하나는 임시 저장 연산자 스택 S1(끝 기호 포함)으로, a 역방향 폴란드어 스택 S2(빈 스택)에 대한 입력으로 S1 스택은 우선 순위가 가장 낮은 연산자 #에 먼저 들어갈 수 있습니다. 중위 표현식은 우선 순위가 가장 낮은 연산자로 끝나야 합니다. 다른 문자를 지정할 수 있지만 반드시 #일 필요는 없습니다. 중위 표현식의 왼쪽 끝에서 문자를 가져와서 다음과 같이 단계별로 진행합니다.

(1) 빼낸 문자가 피연산자이면 전체 피연산자가 분석되고 피연산자가 S2 스택으로 직접 전송됩니다. 꺼낸 문자가 연산 문자이고 현재 S1 스택의 최상위가 (이면 현재 연산자가 S1 스택에 직접 푸시됩니다.

(2) 꺼낸 문자가 연산자인 경우 연산자를 다음과 비교합니다. S1 스택의 최상위 요소 연산자가 우선순위를 갖는 경우 S1 스택 맨 위에 있는 연산자의 우선순위가 S1 스택에 있는 연산자의 우선순위보다 높으면 S1 스택 맨 위에 있는 연산자가 우선순위가 됩니다. S1 스택 상단의 연산자가 다음보다 낮을 때까지(같지 않음) S2 스택으로 전송됩니다. 연산자 우선 순위는 S1 스택으로 전송됩니다.

(3) 가져온 문자가 "( "이면 S1 스택의 맨 위로 바로 전송됩니다.

(4) 꺼낸 문자가 "("이면 S1 스택의 맨 위로 전송됩니다. 문자가 ")"이면 S1 스택의 맨 위로 전송됩니다. S1 스택의 맨 위에서 가장 가까운 "(" 사이의 연산자는 스택에서 하나씩 팝되어 S2 스택으로 차례로 전송됩니다. 이때 "("는 삭제됩니다.

(5) 반복 입력 문자가 모두 처리될 때까지 1단계 ~4단계

(6) 빼낸 문자가 "#"이면 S1 스택의 모든 연산자("#" 제외)를 하나씩 팝하여 S2로 보냅니다.

위 단계를 완료하면 S2 스택은 역폴란드 형식으로 결과를 출력합니다. 그러나 S2는 역폴란드 계산 방법에 따라 계산할 수 있습니다!

math_rpn.php 파일은 다음과 같습니다.

<?php
/**
 * math_rpn 
 *
 * 实现逆波兰式算法
 *  
 */
class math_rpn {
  //初始的计算表达式
  private $_expression = &#39;&#39;;
  //处理后的逆波兰表达式
  private $_rpnexp = array();
  //模拟栈结构的数组
  private $_stack = array(&#39;#&#39;);
  //正则判断
  //private $_reg  = &#39;/^([A-Za-z0-9\(\)\+\-\*\/])*$/&#39;;
  //优先级
  private $_priority = array(&#39;#&#39; => 0, &#39;(&#39; => 10, &#39;+&#39; => 20, &#39;-&#39; => 20, &#39;*&#39; => 30, &#39;/&#39; => 30);
  //四则运算
  private $_operator = array(&#39;(&#39;, &#39;+&#39;, &#39;-&#39;, &#39;*&#39;, &#39;/&#39;, &#39;)&#39;);
  public function __construct($expression) {
    $this->_init($expression);
  }
  private function _init($expression) {
    $this->_expression = $expression;
  }
  public function exp2rpn() {
    $len = strlen($this->_expression);
    for($i = 0; $i < $len; $i++) {
      $char = substr($this->_expression, $i, 1);
      if ($char == &#39;(&#39;) {
        $this->_stack[] = $char;
        continue;
      } else if ( ! in_array($char, $this->_operator)) {
        $this->_rpnexp[] = $char;
        continue;
      } else if ($char == &#39;)&#39;) {
        for($j = count($this->_stack); $j >= 0; $j--) {
          $tmp = array_pop($this->_stack);
          if ($tmp == "(") {
            break; 
          } else {
            $this->_rpnexp[] = $tmp;
          }
        }
        continue;
      } else if ($this->_priority[$char] <= $this->_priority[end($this->_stack)]) {
        $this->_rpnexp[] = array_pop($this->_stack);
        $this->_stack[] = $char;
        continue;
      } else {
        $this->_stack[] = $char;
        continue;
      }
    }
    for($i = count($this->_stack); $i >= 0; $i--) {
      if (end($this->_stack) == &#39;#&#39;) break;
      $this->_rpnexp[] = array_pop($this->_stack); 
    }
    return $this->_rpnexp;
  }
}
//测试实例
$expression = "(A*(B+C)-E+F)*G";
var_dump($expression);
$mathrpn = new math_rpn($expression);
var_dump($mathrpn->exp2rpn());
/*End of php*/
로그인 후 복사
.

관련 권장 사항:

php 이진 트리 탐색 알고리즘 및 예제

php array_chunk()_PHP 없이 배열을 분할하는 알고리즘 튜토리얼

php 이벤트 후보 추첨 기능 구현 코드

위 내용은 PHP 역 폴란드 급여 계산 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿