package com.coding.basic.stack.expr; import java.util.List; import java.util.Stack; public class InfixExpr { String expr = null; public InfixExpr(String expr) { this.expr = expr; } public float evaluate() { // if(expr == null || "".equals(expr)){ // return 0; // } // Stack numStack = new Stack(); // Stack opStack = new Stack(); // String[] ss = expr.split(""); // boolean needOper = false;// 需要运算,遇到* / 后置为true // boolean foundOper = true;// 遇到运算符 // String ops = "+-*/"; // for (int i=0;i<ss.length;i++) { // String s = ss[i]; // if(ops.indexOf(s) != -1){ // if(needOper){ // doMulOrDivOp(numStack, (String)opStack.pop()); // needOper = false; // } // opStack.push(s); // foundOper = true; // if("+-".indexOf(s) != -1){ // // }else{ // needOper = true; // } // }else if(!foundOper){// 未找到运算符前,字符串一直追加 // String tmp = ""; // Object obj = numStack.pop(); // if(obj != null){ // tmp = (String)obj; // } // numStack.push(tmp + s); // }else if("1234567890".indexOf(s) != -1){ // numStack.push(s); // foundOper = false; // }else{ // throw new RuntimeException("InfixExpr not support " + s + " !"); // } // if((i == ss.length - 1) && needOper){ // doMulOrDivOp(numStack, (String)opStack.pop()); // } // } // if(numStack.size() > 1){ // doAddOrSubOps(numStack, opStack); // } // return new Float((String)numStack.pop()); TokenParser parser = new TokenParser(); List<Token> tokens = parser.parse(this.expr); Stack<Token> opStack = new Stack<>(); Stack<Float> numStack = new Stack<>(); for(Token token : tokens){ if (token.isOperator()){ if(opStack.isEmpty()){ opStack.push(token); } else{ while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){ Token prevOperator = opStack.pop(); Float f2 = numStack.pop(); Float f1 = numStack.pop(); Float result = calculate(prevOperator.toString(), f1,f2); numStack.push(result); } opStack.push(token); } } if(token.isNumber()){ numStack.push(new Float(token.getIntValue())); } } while(!opStack.isEmpty()){ Token token = opStack.pop(); Float f2 = numStack.pop(); Float f1 = numStack.pop(); numStack.push(calculate(token.toString(), f1,f2)); } return numStack.pop().floatValue(); } /** * 多个加减 * @param numStack * @param opStack */ private void doAddOrSubOps(Stack numStack, Stack opStack) { Stack calStack = new Stack(); while(numStack.size() > 1){ calStack.push(numStack.pop()); calStack.push(opStack.pop()); } float num1 = new Float((String)numStack.pop()); float num2; while(calStack.size() > 0){ String op = (String)calStack.pop(); num2 = new Float((String)calStack.pop()); if("+".equals(op)){ num1 += num2; }else{ num1 -= num2; } } numStack.push(num1 + ""); } /** * 单个乘除 * @param numStack * @param op */ private void doMulOrDivOp(Stack numStack, String op){ float num2 = new Float((String)numStack.pop()); float num1 = new Float((String)numStack.pop()); String result = null; if("*".equals(op)){ result = (num1 * num2) + ""; }else{ result = (num1 / num2) + ""; } numStack.push(result); } private Float calculate(String op, Float f1, Float f2){ if(op.equals("+")){ return f1+f2; } if(op.equals("-")){ return f1-f2; } if(op.equals("*")){ return f1*f2; } if(op.equals("/")){ return f1/f2; } throw new RuntimeException(op + " is not supported"); } }