2 回答
![?](http://img1.sycdn.imooc.com/5c4aa098000126bb09600960-100-100.jpg)
TA贡献1797条经验 获得超4个赞
这是一个简单的评估器:
public class Evaluator {
private final char[] chars;
private int pos;
public static double evaluate(String expr) {
return new Evaluator(expr).expression();
}
private Evaluator(String expr) {
chars = expr.toCharArray();
}
private double expression() {
double value = term();
char op;
while (skipSpaces() && ((op = chars[pos]) == '+' || op == '-')) {
++pos;
double other = term();
switch (op) {
case '+':
value += other;
break;
case '-':
value -= other;
break;
}
}
return value;
}
private double term() {
double value = factor();
char op;
while (skipSpaces() && ((op = chars[pos]) == 'x' || op == '/')) {
++pos;
double other = factor();
switch (op) {
case 'x':
value *= other;
break;
case '/':
value /= other;
break;
}
}
return value;
}
private double factor() {
if (skipSpaces() && chars[pos] == '(') {
++pos;
double result = expression();
if (skipSpaces() && chars[pos] == ')') {
++pos;
}
return result;
}
return number();
}
private double number() {
if (!skipSpaces()) {
return 0;
}
int start = pos;
if (chars[pos] == '+' || chars[pos] == '-') {
++pos;
}
if (pos >= chars.length || !Character.isDigit(chars[pos])) {
return 0;
}
do {
++pos;
} while (pos < chars.length
&& (Character.isDigit(chars[pos]) || chars[pos] == '.'));
return Double.parseDouble(new String(chars, start, pos-start));
}
private boolean skipSpaces() {
while (pos < chars.length && Character.isWhitespace(chars[pos])) {
++pos;
}
return pos < chars.length;
}
}
添加回答
举报