首頁 >後端開發 >php教程 >調車場演算法如何簡化 PHP 中的數學表達式求值?

調車場演算法如何簡化 PHP 中的數學表達式求值?

Patricia Arquette
Patricia Arquette原創
2025-01-03 12:53:39971瀏覽

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

用PHP 建立計算器

簡化輸入到 中的數學表達式PHP 中的標籤可能具有挑戰性,尤其是在保留原始符號時。雖然用計算值替換字串的暴力方法最初似乎可行,但效率很低。

利用 Shunting Yard 演算法

更有效的解法是 Shunting碼演算法。它將輸入表達式轉換為逆波蘭表示法 (RPN)。 RPN 簡化了計算,因為操作數後面緊跟著其運算子。

實作範例

以下程式碼提供了PHP 中調車場演算法的實作:

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,評估結果堆疊,並傳回最終結果結果。

以上是調車場演算法如何簡化 PHP 中的數學表達式求值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn