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();
}