C ++ Преобразование Postfix в инфикс - PullRequest
1 голос
/ 08 марта 2012

Так что я программирую калькулятор на основе cmd в C ++.Я закончил это, но мне было интересно, после преобразования инфикса в постфикс, у меня есть очередь, называемая очередью постфикса, содержащей операторы / операнды в правильном порядке.Как преобразовать постфиксное выражение обратно в инфикс?

1 Ответ

1 голос
/ 08 марта 2012

Если вы не против создания дополнительных скобок, это должно быть довольно просто. Вы в основном «оцениваете» данные постфикса примерно так же, как обычно, за исключением того, что когда вы получаете оператор, вместо того, чтобы оценивать этот оператор и помещать результат в стек, вы распечатываете открытое слово, первый операнд, оператор, второй операнд и, наконец, близкий друг.

Если вы не возражаете против изменения порядка, было бы также довольно легко избежать лишних скобок. Переместите выражение назад, переставляя вещи из operator operand operand в operand operator operand. Если вы сталкиваетесь с оператором, где вам нужен операнд, у вас есть подвыражение для печати аналогичным образом. Вам необходимо заключить это подвыражение в скобки, если и только если его оператор имеет более низкий приоритет, чем оператор, с которым вы столкнулись ранее.

Например, рассмотрим: a b + c *. Пройдя назад, мы получим *, затем c, поэтому начнем с распечатки c *. Затем нам нужен другой операнд, но у нас есть +, поэтому у нас есть подвыражение. Поскольку + имеет более низкий приоритет, чем *, нам нужно заключить это подвыражение в скобки, поэтому мы получим c * (b + a).

И наоборот, если бы у нас было: a b * c +, мы бы начали аналогичным образом, производя c +, но тогда, поскольку * на выше приоритет, чем +, мы можем / могли бы распечатать a * b (или b * a) без символов.

Обратите внимание, что с - или / (или чем-то еще, что не является коммутативным), вам нужно быть немного более осторожным, чтобы правильно определить порядок операндов. Несмотря на это, вы не получите обратно исходное выражение, только выражение, которое должно быть логически эквивалентно ему.

...