package algorithm.expression; import datastructure.basic.Stack; import java.util.EmptyStackException; import java.util.List; public class PostfixExpr { private String expr; private String splitRegex; private Stack stack = new Stack(); public PostfixExpr(String expr) { this.expr = expr; this.splitRegex = " "; } public PostfixExpr(String expr, String splitRegex) { this.expr = expr; this.splitRegex = splitRegex; } public float evaluate() { stack.clear(); List<Token> tokens = TokenParser.parse(expr, splitRegex); try { for (Token token : tokens) { if (token.isNumber()) { stack.push(token); } else { Token num1 = (Token) stack.pop(); Token num2 = (Token) stack.pop(); stack.push(Token.calculate(num2, token, num1)); } } } catch (EmptyStackException e) { throw new RuntimeException("Wrong expression: " + expr); } if (stack.size() != 1) { throw new RuntimeException("Wrong expression: " + expr); } return ((Token) stack.pop()).getFloatValue(); } }