import java.util.*; public class PostfixEvaluator { public static String evaluate(String expr) { if (expr.length() == 0) { return "No input."; } Stack operands = new Stack(); TokenScanner input = new TokenScanner(expr); Token tkn; try { if (!input.hasNextToken()) { return "No input."; } while (input.hasNextToken()) { tkn = input.nextToken(); if (tkn.isNumber()) { operands.push(tkn.numberValue()); } else if (tkn.isOperator()) { operation(operands, tkn.operatorCharValue()); } else if (tkn.isLeftParen() || tkn.isRightParen()) { return ("( and ) have no meaning here"); } else { return ("Bad input."); } } Double x = operands.pop(); if (!operands.empty()) { return ("Computed " + x + " but values remain on stack."); } if (!input.reachedEnd()) { return ("Computed " + x + " but not all input used."); } return x.toString(); } catch (ArithmeticException e1) { return e1.getMessage(); } catch (EmptyStackException e2) { return "Stack underflow. Not enough operands on stack."; } } private static void operation(Stack operands, Character op) { Double op1, op2; op2 = operands.pop(); op1 = operands.pop(); switch (op) { case '+': operands.push(op1 + op2); break; case '-': operands.push(op1 - op2); break; case '*': operands.push(op1 * op2); break; case '/': try { operands.push(op1 / op2); } catch (ArithmeticException e1) { System.out.println("We tried to divide by zero"); System.exit(-1); } break; } } }