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