PHP에서 계산기 만들기
PHP의 태그는 특히 원래 표기법을 보존할 때 어려울 수 있습니다. 문자열을 계산된 값으로 바꾸는 무차별 접근 방식은 처음에는 실행 가능해 보이지만 비효율적입니다.
Shunting Yard 알고리즘 활용
더 효과적인 솔루션은 Shunting입니다. 야드 알고리즘. 입력 표현식을 역폴란드 표기법(RPN)으로 변환합니다. RPN은 피연산자 바로 뒤에 연산자가 오기 때문에 계산을 단순화합니다.
구현 예
다음 코드는 PHP에서 Shunting Yard 알고리즘의 구현을 제공합니다.
class Expression { protected $tokens; protected $output; // Shunting Yard Algorithm public function shuntingYard($input) { $stack = []; $tokens = $this->tokenize($input); foreach ($tokens as $token) { if (is_numeric($token)) { $this->output[] = $token; } else { switch ($token) { case '(': $stack[] = $token; break; case ')': while ($stack && end($stack) != '(') { $this->output[] = array_pop($stack); } if (!empty($stack)) { array_pop($stack); } break; default: while ($stack && $this->precedence($token) <= $this->precedence(end($stack))) { $this->output[] = array_pop($stack); } $stack[] = $token; break; } } } while (!empty($stack)) { $this->output[] = array_pop($stack); } } // Tokenize the input public function tokenize($input) { preg_match_all('~\d+|~|~U', $input, $tokens); return $tokens[0]; } // Operator precedence public function precedence($operator) { switch ($operator) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } // Evaluate the RPN expression public function evaluate() { $stack = []; foreach ($this->output as $token) { if (is_numeric($token)) { $stack[] = $token; } else { $operand2 = array_pop($stack); $operand1 = array_pop($stack); switch ($token) { case '+': $result = $operand1 + $operand2; break; case '-': $result = $operand1 - $operand2; break; case '*': $result = $operand1 * $operand2; break; case '/': $result = $operand1 / $operand2; break; } $stack[] = $result; } } return array_pop($stack); } } $expression = new Expression(); $expression->shuntingYard('8*(5+1)'); $result = $expression->evaluate(); echo $result; // Output: 48
이 코드는 입력을 RPN으로 변환하고 결과 스택을 평가한 후 최종 결과.
위 내용은 Shunting Yard 알고리즘이 PHP에서 수학적 표현 평가를 어떻게 단순화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!