package com.github.orajavac.coding2017.basic.stack.expr; import java.util.HashMap; import java.util.Map; import com.github.orajavac.coding2017.jvm.util.Util; import com.github.orajavac.coding2017.basic.stack.Stack; /* * 前序表达式 */ public class PrefixExpr { String expr = null; private final String ADD = "+"; private final String SUB = "-"; private final String MUL = "*"; private final String DIV = "/"; private Map<String,Integer> operator = new HashMap<String,Integer>(); private Stack num = new Stack(); public PrefixExpr(String expr) { this.expr = expr; this.operator.put(this.ADD,1); this.operator.put(this.SUB,1); this.operator.put(this.MUL,2); this.operator.put(this.DIV,2); } public float evaluate() { String[] expr = Util.parseOperatorToArray(this.expr); /** * 4*2 + 6+9*2/3 -8 * - + + 6 / *2 9 3 * 4 2 8 */ for (int i=expr.length-1;i>=0;i--){ if (this.operator.containsKey(expr[i])){ num.push(calculate(expr[i], Float.parseFloat(num.pop().toString()), Float.parseFloat(num.pop().toString()))); }else{ num.push(expr[i]); } } return Float.parseFloat(num.pop().toString()); } 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"); } }