だから私は C++ で cmd ベースの電卓をプログラミングしています。私はそれを終えましたが、インフィックスをポストフィックスに変換した後、演算子/オペランドを正しい順序で含むポストフィックスキューと呼ばれるキューがあるのだろうかと思っていました。後置式を中置式に戻すにはどうすればよいですか?
1 に答える
余分な括弧を作成してもかまわない場合は、非常に簡単です。基本的に後置データを通常どおりに「評価」しますが、演算子に到達したときに、その演算子を評価して結果をスタックにプッシュする代わりに、開きかっこ、最初のオペランド、演算子、 2 番目のオペランド、最後に閉じ括弧。
順序を変更してもかまわない場合は、不要な括弧を避けるのも非常に簡単です。式を逆方向にたどり、 からoperator operand operand
に並べ替えoperand operator operand
ます。オペランドが必要な演算子に遭遇した場合は、同様に出力するサブ式があります。その部分式を括弧で囲む必要があるのは、その演算子が以前に遭遇した演算子よりも優先順位が低い場合だけです。
たとえば、次のように考えてくださいa b + c *
。これを逆方向にたどると、 が得られるので*
、c
出力することから始めc *
ます。次に、別のオペランドが必要ですが、 がある+
ため、部分式があります。+
は よりも優先順位が低いため*
、その部分式を括弧で囲む必要があるため、 を取得しc * (b + a)
ます。
逆に、もし : があれば、a b * c +
同様に を生成して開始しますが、 の方が優先度が高いc +
ため、括弧なしで(または) を出力できます。*
+
a * b
b * a
-
or /
(または可換ではないもの) を使用すると、オペランドの順序を正しくすることにもう少し注意する必要があることに注意してください。それでも、元の式を戻すことはできず、論理的に等価であるはずの式だけが返されます。