我有一个程序,用户输入6个双打,程序输出每个操作符组合,可以作为1024个单独的字符串进入双打之间。如果用户输入14,17,200,1,5和118:
,则前两个结果如下"14.0+17.0+200.0+1.0+5.0+118.0"
"14.0+17.0+200.0+1.0+5.0-118.0"
我想要做的是按照操作顺序执行算术。每个double都存储为变量a到f,这些变量之间的每个运算符都存储为char a_b到e_f。所以:
double a, b, c, d, e, f;
char a_b, b_c, c_d, d_e, e_f;
我的第一个想法是编写这样的代码:
public double operateGroup() {
value = 0;
switch (a_b) {
case '+':
value += a + b;
break;
case '-':
value += a - b;
break;
case '*':
value += a * b;
break;
case '/':
value += a / b;
break;
default:
break;
}
switch (b_c) {
case '+':
value += c;
break;
case '-':
value += -c;
break;
case '*':
value *= c;
break;
case '/':
value /= c;
break;
default:
break;
}
switch (c_d) {
case '+':
value += d;
break;
case '-':
value += -d;
break;
case '*':
value *= d;
break;
case '/':
value /= d;
break;
default:
break;
}
switch (d_e) {
case '+':
value += e;
break;
case '-':
value += -e;
break;
case '*':
value *= e;
break;
case '/':
value /= e;
break;
default:
break;
}
switch (e_f) {
case '+':
value += f;
break;
case '-':
value += -f;
break;
case '*':
value *= f;
break;
case '/':
value /= f;
break;
default:
break;
}
return value;
}
但是这不起作用,因为它与做(a O b)O c)O d)O e)相同,其中O是任意运算符。有什么提示吗?
答案 0 :(得分:2)
由于没有括号,一个简单的方法将起作用:
*
或/
时,请X
或X*Y
替换X/Y
,并删除Y;也删除运营商要实施此方法,请定义两个列表 - N
Double
和N-1
运算符列表,并按如下方式实施计算:
ArrayList<Double> vals = ...
ArrayList<Integer> ops = ... // 1=+, 2=-, 3=*, 4=/
for (int i = 0 ; i < ops.Count ; i++) {
int op = ops.get(i);
if (op == 3 || op == 4) {
if (op == 3) {
vals.set(i, vals.get(i) * vals.get(i+1));
} else {
vals.set(i, vals.get(i) / vals.get(i+1));
}
ops.remove(i);
vals.remove(i+1);
i--;
}
}
double res = vals.get(0);
for (int i = 0 ; i != ops.Count ; i++) {
if (op == 1) {
res += vals.get(i);
} else {
res -= vals.get(i);
}
}
答案 1 :(得分:1)
如果您需要运营商和操作数信息,则应构建 Parse Tree (此has been asked before)。
如果您只对结果感兴趣,可以直接评估String
:
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
public class Eval {
public static void main(String[] args) throws Exception {
ScriptEngineManager s = new ScriptEngineManager();
ScriptEngine engine = s.getEngineByName("JavaScript");
String exp = "14.0+17.0+200.0+1.0+5.0-118.0";
System.out.println(engine.eval(exp));
}
}
输出:
119.0
答案 2 :(得分:0)
我会说你应该把它解析成树然后走树来评估。数字是叶子节点,运算符是父节点。