首页 >后端开发 >php教程 >调车场算法如何简化 PHP 中的数学表达式求值?

调车场算法如何简化 PHP 中的数学表达式求值?

Patricia Arquette
Patricia Arquette原创
2025-01-03 12:53:39970浏览

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