package task0416.coding.basic.stuck.expr; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class InfixExpr { String expr = null; public InfixExpr(String expr) { this.expr = expr; } /* */ public float evaluate() { Stack<Token> oStack = new Stack<>(); Stack<Float> nStack = new Stack<>(); TokenParser tp = new TokenParser(expr); List<Token> array = tp.getParserList(); for (int i = 0; i < array.size(); i++) { Token t = array.get(i); String type = t.getType(); if(type.equals(Token.NUMBER)){ nStack.push(Float.valueOf(t.getValue())); }else if(type.equals(Token.OPERATOR)){ if(oStack.isEmpty()||t.getLevel()>oStack.peek().getLevel()){ oStack.push(t); }else{ nStack.push(operation(nStack,oStack)); oStack.push(t); } } } while(!oStack.isEmpty()){ nStack.push(operation(nStack,oStack)); } return nStack.peek(); } private Float operation(Stack<Float> nStack, Stack<Token> oStack) { Float num1 = nStack.pop(); Float num2 = nStack.pop(); String operator = oStack.pop().getValue(); switch(operator){ case "+": return num2+num1; case "-": return num2-num1; case "*": return num2*num1; case "/": return num2/num1; } return null; } }