package me.lzb.basic.expr;
import java.util.List;
import java.util.Stack;
/**
* 中序表达式
* Created by LZB on 2017/4/15.
*/
public class InfixExpr {
private String expr;
public InfixExpr(String expr) {
this.expr = expr;
}
public float evaluate() {
List<Node> list = CalUtil.processInfixExpr(expr);
Stack<String> symbolStack = new Stack<>();
Stack<Float> numberStack = new Stack<>();
boolean calLevel2 = false;
for (Node n : list) {
if (n.isNumber()) {
numberStack.push(n.number);
if (calLevel2) {
CalUtil.calculate(symbolStack, numberStack, false);
calLevel2 = false;
}
} else {
symbolStack.push(n.symbol);
if (n.isLevel2()) {
calLevel2 = true;
}
}
}
Stack<Float> tn = new Stack<>();
int nsize = numberStack.size();
for (int i = 0; i < nsize; i++) {
tn.push(numberStack.pop());
}
numberStack = tn;
Stack<String> ts = new Stack<>();
int ssize = symbolStack.size();
for (int i = 0; i < ssize; i++) {
ts.push(symbolStack.pop());
}
symbolStack = ts;
while (!symbolStack.isEmpty()) {
CalUtil.calculate(symbolStack, numberStack, true);
}
return numberStack.pop();
}
}