Rumah >pembangunan bahagian belakang >tutorial php >Bagaimanakah Algoritma Shunting Yard Memudahkan Penilaian Ungkapan Matematik dalam PHP?
Mencipta Kalkulator dalam PHP
Mempermudahkan ungkapan matematik yang dimasukkan ke dalam tag dalam PHP boleh mencabar, terutamanya apabila mengekalkan notasi asal. Walaupun pendekatan brute-force menggantikan rentetan dengan nilai yang dikira kelihatan berdaya maju pada mulanya, ia menjadi tidak cekap.
Menggunakan Algoritma Shunting Yard
Penyelesaian yang lebih berkesan ialah Shunting Algoritma Yard. Ia menukar ungkapan input kepada Notasi Bahasa Poland Songsang (RPN). RPN memudahkan pengiraan kerana operan diikuti dengan serta-merta oleh pengendalinya.
Contoh Pelaksanaan
Kod berikut menyediakan pelaksanaan Algoritma Shunting Yard dalam 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
Kod ini menterjemah input ke dalam RPN, menilai timbunan yang terhasil dan mengembalikan yang terakhir hasil.
Atas ialah kandungan terperinci Bagaimanakah Algoritma Shunting Yard Memudahkan Penilaian Ungkapan Matematik dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!