>백엔드 개발 >PHP 튜토리얼 >PHP는 역 폴란드식 방법을 사용하여 급여_php 팁을 계산합니다.

PHP는 역 폴란드식 방법을 사용하여 급여_php 팁을 계산합니다.

WBOY
WBOY원래의
2016-05-16 20:09:31786검색

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

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

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

(1) 꺼낸 문자가 피연산자인 경우 전체 피연산자를 분석하고, 꺼낸 문자가 연산자이고 현재 S1 스택의 최상위가 다음인 경우 피연산자를 S2 스택으로 직접 보냅니다. (다음에는 현재 연산자가 S1 스택

에 직접 들어갑니다.

(2) 꺼낸 문자가 연산자인 경우 연산자를 S1 스택의 최상위 요소와 비교합니다. 연산자의 우선순위가 S1 스택의 맨 위에 있는 연산자의 우선순위보다 높으면 추가합니다. 그렇지 않으면 S1 스택의 최상위 연산자를 팝하여 S1 스택의 최상위 연산자가 연산자의 우선 순위보다 낮을 때까지(같지 않음) 보냅니다. S1 스택에 대한 연산자입니다.

(3) 꺼낸 문자가 "("인 경우 S1 스택의 맨 위로 직접 전송됩니다.

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

(5) 입력된 문자가 모두 처리될 때까지 위의 1~4단계를 반복하세요.

(6) 빼낸 문자가 "#"이면 S1 스택의 모든 연산자("#" 제외)가 스택에서 하나씩 팝되어 S2 스택으로 순차적으로 전송됩니다.

위 단계를 완료한 후 S2 스택은 결과를 역폴란드 형식으로 출력합니다. 그러나 S2는 일부 역방향 처리를 수행해야 합니다. 그러면 역폴란드 계산법에 따라 계산하시면 됩니다!

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

<&#63;php
/**
 * math_rpn 
 *
 * 实现逆波兰式算法
 *  
 */
class math_rpn {
  //初始的计算表达式
  private $_expression = '';
  //处理后的逆波兰表达式
  private $_rpnexp = array();
  //模拟栈结构的数组
  private $_stack = array('#');
  //正则判断
  //private $_reg  = '/^([A-Za-z0-9\(\)\+\-\*\/])*$/';
  //优先级
  private $_priority = array('#' => 0, '(' => 10, '+' => 20, '-' => 20, '*' => 30, '/' => 30);
  //四则运算
  private $_operator = array('(', '+', '-', '*', '/', ')');
  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 == '(') {
        $this->_stack[] = $char;
        continue;
      } else if ( ! in_array($char, $this->_operator)) {
        $this->_rpnexp[] = $char;
        continue;
      } else if ($char == ')') {
        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) == '#') 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 프로그래밍 설계에 도움이 되기를 바랍니다.

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