С++ Преобразование постфикса в инфикс

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


person Richard    schedule 07.03.2012    source источник
comment
Вы не можете преобразовать его «обратно» в инфикс, поскольку между этими двумя представлениями нет биективного сопоставления. Это означает, что несколько инфиксных выражений могут давать одно и то же постфиксное выражение, и невозможно сказать, какое из них является исходным. Все, что вы можете сделать, это преобразовать в «некоторое» инфиксное выражение.   -  person Konrad Rudolph    schedule 08.03.2012


Ответы (1)


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

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

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

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

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

person Jerry Coffin    schedule 07.03.2012