Heim > Backend-Entwicklung > PHP-Tutorial > Wie kann der Shunting Yard-Algorithmus die Auswertung mathematischer Ausdrücke in PHP vereinfachen?

Wie kann der Shunting Yard-Algorithmus die Auswertung mathematischer Ausdrücke in PHP vereinfachen?

Patricia Arquette
Freigeben: 2025-01-03 12:53:39
Original
968 Leute haben es durchsucht

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

Erstellen eines Rechners in PHP

Vereinfachung mathematischer Ausdrücke, die in ein eingegeben werden -Tags in PHP kann eine Herausforderung sein, insbesondere wenn die Originalnotation erhalten bleibt. Während ein Brute-Force-Ansatz zum Ersetzen von Zeichenfolgen durch berechnete Werte zunächst realisierbar erscheint, wird er ineffizient.

Verwendung des Rangierbahnhof-Algorithmus

Eine effektivere Lösung ist das Rangieren Yard-Algorithmus. Es konvertiert Eingabeausdrücke in die umgekehrte polnische Notation (RPN). RPN vereinfacht Berechnungen, da auf Operanden unmittelbar ihre Operatoren folgen.

Implementierungsbeispiel

Der folgende Code stellt eine Implementierung des Shunting Yard-Algorithmus in PHP bereit:

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
Nach dem Login kopieren

Dieser Code übersetzt die Eingabe in RPN, wertet den resultierenden Stapel aus und gibt das Endergebnis zurück Ergebnis.

Das obige ist der detaillierte Inhalt vonWie kann der Shunting Yard-Algorithmus die Auswertung mathematischer Ausdrücke in PHP vereinfachen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage