ホームページ >バックエンド開発 >PHPチュートリアル >操車場アルゴリズムはどのようにして PHP での数式評価を簡素化できるのでしょうか?

操車場アルゴリズムはどのようにして PHP での数式評価を簡素化できるのでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-03 12:53:39989ブラウズ

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

PHP での電卓の作成

に入力された数式の簡略化PHP でタグを使用するのは、特に元の表記を保持する場合に困難になる場合があります。文字列を計算値に置き換える強引なアプローチは最初は実行可能に見えますが、非効率になります。

Shanging Yard アルゴリズムの利用

より効果的な解決策は、Shanging です。ヤードアルゴリズム。入力式を逆ポーランド記法 (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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。