package com.github.orajavac.coding2017.basic.stack.expr;
import java.util.HashMap;
import java.util.Map;
import com.github.orajavac.coding2017.basic.stack.Stack;
import com.github.orajavac.coding2017.jvm.util.Util;
/*
* 后序表达式
*/
public class PostfixExpr {
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 PostfixExpr(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);
for (int i=0;i<expr.length;i++){
if (this.operator.containsKey(expr[i])){
Float f1 = Float.parseFloat(num.pop().toString()); //6
Float f2 = Float.parseFloat(num.pop().toString()); //10
if(isOperator(expr[i].charAt(0))){ //对于减法,f1,f2互换
float f3 = f2;
f2 = f1;
f1 = f3;
}
num.push(calculate(expr[i],f1,f2));
}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");
}
private boolean isOperator(char c1){
if(c1=='+')
return true;
if(c1=='/')
return true;
if(c1=='-')
return true;
if(c1=='*')
return true;
return false;//其他的都返回false
};
}