1

以前の質問からのフィードバックに基づいて、方程式の文字列表現をRPNに変換するパーサーをPHPで作成しました。それをテストしている間、私はRPNで同じものに解析する2つの異なる方程式を見つけました。それらを解決すると、RPNで同じものになるため、同じ答えが得られます。

  1. 3 + 4 * 8 /(1 -5)
  2. 3 + 4 * 8/1 -5

どちらも最終的に348*15-/ +になります。これを解くと、最初の答えは-5になりますが、2番目の答えは30になります。

では、RPNに変換する方法を誤解しましたか?私のパーサーへのコードは、前の質問への上記のリンクにあります。

4

1 に答える 1

1

パーサーにエラーが見つかりました。最後の大きなelseブロックでは、交換する必要があります

$current = end($stack);
if($operators[$tokens[$i]] == $operators[$current]) {
  $rpn .= array_pop($stack);
  $stack[] = $tokens[$i];
} else {
  $stack[] = $tokens[$i];
}

while(!empty($stack) && end($stack) != '(' && $operators[$tokens[$i]] >= $operators[end($stack)]) {
  $rpn .= array_pop($stack);
}
$stack[] = $tokens[$i];

その変更後、2つのテストケースはここで正常に機能します。(私はこのリファレンスを使用してコードを修正しました。質問の問題を修正した後、コードのチェックを停止したため、内部にさらにバグがある可能性があります-すべてを校正しませんでした!)

編集:重要なことは、"=="を">="に置き換えることです。優先順位が常に2レベルしかない場合はif、をループに置き換える必要はありません。

于 2009-11-27T13:22:58.147 に答える