이 기사의 예에서는 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 파일은 다음과 같습니다.
<?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 프로그래밍 설계에 도움이 되기를 바랍니다.