Итак, я программирую калькулятор на основе cmd на C++. Я закончил это, но мне интересно, после преобразования инфикса в постфикс у меня есть очередь, называемая очередью постфикса, содержащая операторы/операнды в правильном порядке. Как преобразовать постфиксное выражение обратно в инфиксное?
С++ Преобразование постфикса в инфикс
Ответы (1)
Если вы не возражаете против создания дополнительных скобок, это должно быть довольно легко. Вы в основном «вычисляете» постфиксные данные примерно так же, как обычно, за исключением того, что когда вы добираетесь до оператора, вместо того, чтобы вычислять этот оператор и помещать результат в стек, вы печатаете открывающую скобку, первый операнд, оператор, второй операнд и, наконец, закрывающая скобка.
Если бы вы не возражали против изменения порядка, было бы также довольно легко избежать лишних скобок. Пройдите выражение в обратном порядке, переставляя элементы из operator operand operand
в operand operator operand
. Если вы столкнетесь с оператором, где вам нужен операнд, у вас есть подвыражение, которое нужно распечатать аналогичным образом. Вам нужно заключить это подвыражение в круглые скобки тогда и только тогда, когда его оператор имеет более низкий приоритет, чем оператор, с которым вы столкнулись ранее.
Например, рассмотрим: a b + c *
. Проходя это в обратном порядке, мы получаем *
, затем c
, поэтому мы начинаем с вывода c *
. Затем нам нужен еще один операнд, но у нас есть +
, поэтому у нас есть подвыражение. Поскольку +
имеет более низкий приоритет, чем *
, нам нужно заключить это подвыражение в круглые скобки, чтобы мы получили c * (b + a)
.
И наоборот, если бы у нас было: a b * c +
, мы бы начали аналогичным образом, производя c +
, но затем, поскольку *
имеет более высокий приоритет, чем +
, мы можем/могли бы распечатать a * b
(или b * a
) без скобок.
Обратите внимание, что с -
или /
(или чем-то еще, что не является коммутативным) вам нужно быть немного более осторожным, чтобы получить правильный порядок операндов. Даже в этом случае вы не получите обратно исходное выражение, а только выражение, которое должно быть ему логически эквивалентно.