package com.github.miniyk2012.coding2017.basic.stack.expr; import java.util.Collections; import java.util.List; import java.util.Stack; /** https://en.wikipedia.org/wiki/Polish_notation Scan the given prefix expression from right to left for each symbol { if operand then push onto stack if operator then { operand1=pop stack operand2=pop stack compute operand1 operator operand2 push result onto stack } } return top of stack as result */ public class PrefixExpr { String expr = null; public PrefixExpr(String expr) { this.expr = expr; } public float evaluate() { TokenParser parser = new TokenParser(); List<Token> tokens = parser.parse(expr); Collections.reverse(tokens); Stack<Token> operandStack = new Stack<>(); for (Token token: tokens) { if (token.isNumber()) { operandStack.push(token); } else { Token operand1 = operandStack.pop(); Token operand2 = operandStack.pop(); Token result = ExprUtil.evalute(operand1, token, operand2); operandStack.push(result); } } return operandStack.pop().getFloatValue(); } }