2つの方程式をRPNに解析すると、同じ表記が得られますが、回答が異なります
質問
以前の質問。それをテストしながら、RPNで同じことを解析する2つの異なる方程式を見つけました。 RPNで解決すると同じ結果になるため、同じ答えが返されます。
- 3 + 4 * 8 /(1 -5)
- 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
をループに置き換える必要はありません。
所属していません StackOverflow