2つの方程式をRPNに解析すると、同じ表記が得られますが、回答が異なります

StackOverflow https://stackoverflow.com/questions/1808546

  •  05-07-2019
  •  | 
  •  

質問

以前の質問。それをテストしながら、RPNで同じことを解析する2つの異なる方程式を見つけました。 RPNで解決すると同じ結果になるため、同じ答えが返されます。

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

どちらも348 * 15-/ +になり、解決すると-5の回答が得られます。これは最初の回答では正しいですが、2番目の回答は30でなければなりません。

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

役に立ちましたか?

解決

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

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

with

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top