用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中文網其他相關文章!