>백엔드 개발 >PHP 튜토리얼 >Shunting Yard 알고리즘이 PHP에서 수학적 표현 평가를 어떻게 단순화할 수 있습니까?

Shunting Yard 알고리즘이 PHP에서 수학적 표현 평가를 어떻게 단순화할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-03 12:53:39943검색

How Can the Shunting Yard Algorithm Simplify Mathematical Expression Evaluation in PHP?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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