import java.util.Stack; public class PostfixToInfix { public static void main(String[] args) { for (String e : new String[]{"3 4 2 * 1 5 - 2 3 ^ ^ / +", "1 2 + 3 4 + ^ 5 6 + ^"}) { System.out.printf("Postfix : %s%n", e); System.out.printf("Infix : %s%n", postfixToInfix(e)); System.out.println(); } } static String postfixToInfix(final String postfix) { class Expression { final static String ops = "-+/*^"; String op, ex; int prec = 3; Expression(String e) { ex = e; } Expression(String e1, String e2, String o) { ex = String.format("%s %s %s", e1, o, e2); op = o; prec = ops.indexOf(o) / 2; } @Override public String toString() { return ex; } } Stack expr = new Stack<>(); for (String token : postfix.split("\\s+")) { char c = token.charAt(0); int idx = Expression.ops.indexOf(c); if (idx != -1 && token.length() == 1) { Expression r = expr.pop(); Expression l = expr.pop(); int opPrec = idx / 2; if (l.prec < opPrec || (l.prec == opPrec && c == '^')) l.ex = '(' + l.ex + ')'; if (r.prec < opPrec || (r.prec == opPrec && c != '^')) r.ex = '(' + r.ex + ')'; expr.push(new Expression(l.ex, r.ex, token)); } else { expr.push(new Expression(token)); } System.out.printf("%s -> %s%n", token, expr); } return expr.peek().ex; } }