ホームページ >バックエンド開発 >PHPチュートリアル >操車場アルゴリズムはどのようにして 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 サイトの他の関連記事を参照してください。