【发布时间】:2015-10-15 21:39:30
【问题描述】:
我正在评估一个表达式,但在输入负数时遇到了麻烦。由于我的代码结构,以及减法运算符和负号是同一个字符的事实,我的代码不适用于负数。有没有办法解决这个问题?
private float evalNoPB(String s) {
float tempAns = 0;
if (s.contains("*") == false && s.contains("/") == false && s.contains("+") == false && s.contains("-") == false) {
return Float.parseFloat(s);
}
if (s.length() - 1 > 0) {
int i;
boolean foundPlusMinus = false;
for (i = s.length() - 1; i > 0; i--) {
if (s.charAt(i) == '+' || s.charAt(i) == '-') {
System.out.println(i);
foundPlusMinus = true;
break; // keep value of i for substrings
}
foundPlusMinus = false;
}
if (foundPlusMinus == false) { // for loop went through and did not find + or -
for (i = s.length() - 1; i > 0; i--) {
if (s.charAt(i) == '*' || s.charAt(i) == '/') {
System.out.println(i);
break; // keep value of i for substrings
}
}
}
String sub1 = s.substring(0, i);
System.out.println(sub1);
String sub2 = s.substring(i + 1, s.length());
System.out.println(sub2);
if (s.charAt(i) == '+') {
tempAns = evalNoPB(sub1) + evalNoPB(sub2);
} else if (s.charAt(i) == '-') {
tempAns = evalNoPB(sub1) - evalNoPB(sub2);
} else if (s.charAt(i) == '*') {
tempAns = evalNoPB(sub1) * evalNoPB(sub2);
} else if (s.charAt(i) == '/') {
float divisorCheck = evalNoPB(sub2);
if (divisorCheck != 0) {
tempAns = evalNoPB(sub1) / evalNoPB(sub2);
} else { // cannot divide by 0
throw new IllegalArgumentException("cannot divide by 0");
}
}
}
return tempAns;
}
【问题讨论】:
-
你的问题能不能再清楚一点?!!!
-
此代码计算字符串表达式。它适用于诸如
3*4+5之类的字符串,但不适用于诸如-3*4+5之类的字符串,因为负号被视为减法运算符。这是我需要解决的问题 -
扔掉它并查找“递归下降表达式解析器”或 Dijkstra Shutting-yard 算法。你永远不会从这里到达那里。