Question
example: A * B + C becomes A B * C +
A * (B + C) becomes A B C + *
Solution
One of the main purpose of converting infix to postfix is to remove alll parentheses from the expression.
This is a very difficult question. The solution is:
- Print operands as they arrive. 
- If the incoming symbol is ‘+’ or ‘-’ or ‘(’, push it on the stack. 
- If the incoming symbol is a ‘)’, pop the stack and print the operators until you see a ‘(’. Discard the pair of parentheses. 
- If the incoming symbol is ‘*’ or ‘/’, pop until we sees ‘+’ or ‘-’ or ‘(’ at top of the stack, then push the symbol onto the stack. 
- At the end of the expression, pop and print all operators on the stack. (No parentheses should remain.) 
Code
public String solve(String infix) {
    StringBuilder sb = new StringBuilder();
    // get next operand or non-operand
    // notice that operand is >=1 chars
    int p = 0;
    int len = infix.length();
    Stack<Character> stack = new Stack<Character>();
    while (p != len) {
        if (isDigit(infix.charAt(p))) {
            // if char at p is a digit
            int q = p;
            while (q != len && isDigit(infix.charAt(q))) {
                q++;
            }
            // it is a number in the range [p, q-1]
            sb.append(infix.substring(p, q) + " ");
            p = q;
        } else {
            // if char at p is + - * / or ( )
            char op = infix.charAt(p++);
            if (op == ')') {
                // pop until sees a '('
                while (stack.peek() != '(') {
                    sb.append(stack.pop() + " ");
                }
                stack.pop();
            } else if (op == '(' || op == '+' || op == '-') {
                stack.push(op);
            } else {
                // if * or /
                // pop until sees + or - or '('
                while (!stack.isEmpty()) {
                    if (stack.peek() == '+' || stack.peek() == '-' || stack.peek() == '(') {
                        break;
                    }
                    sb.append(stack.pop() + " ");
                }
                stack.push(op);
            }
        }
    }
    // reach Eof, pop everything
    while (!stack.isEmpty()) {
        sb.append(stack.pop() + " ");
    }
    return sb.toString();
}