package com.github.wdn.coding2017.basic.stack.expr; import com.github.wdn.coding2017.basic.Stack; import java.util.Arrays; /** * Created by Administrator on 2017/4/13 0013. */ public class InfixExpr { private String expr; public InfixExpr(String expr) { this.expr = expr; } public float evaluate() { try { String[] numArr = expr.split("[+|\\-|*|/]"); String[] operatorArr = expr.split("\\d+\\d*"); Object[] operators = Arrays.stream(operatorArr).filter(x -> !"".equals(x.trim())).toArray(); Stack numStack = new Stack(); Stack operatorStack = new Stack(); numStack.push(numArr[0]); for (int i = 0; i < operators.length; i++) { int number = Integer.parseInt(numArr[i + 1]); String operator = operators[i].toString(); if (!operatorStack.isEmpty() && Operator.compare(operatorStack.peek().toString(),operator)<0) { float currentResult = Operator.calculate(Integer.parseInt(numStack.pop().toString()), number, operator); numStack.push(currentResult); } else if(!operatorStack.isEmpty() && Operator.compare(operatorStack.peek().toString(),operator)>=0){ float b = Float.parseFloat(numStack.pop().toString()); float a = Float.parseFloat(numStack.pop().toString()); String currentOperator = operatorStack.pop().toString(); float result = Operator.calculate(a, b, currentOperator); numStack.push(result); numStack.push(number); operatorStack.push(operator); }else { numStack.push(number); operatorStack.push(operator); } } while (!operatorStack.isEmpty()) { float b = Float.parseFloat(numStack.pop().toString()); float a = Float.parseFloat(numStack.pop().toString()); String operator = operatorStack.pop().toString(); float result = Operator.calculate(a, b, operator); numStack.push(result); } return Float.parseFloat(numStack.pop().toString()); } catch (Exception e) { e.printStackTrace(); } return 0; } }