我需要帮助通过递归来评估算术表达式(INFIX)。我做了一棵树,从右到左扫描(+, - 第一,*,/秒)。错误是:
输入字符串:“2 + 3”
我不知道我做错了什么。我希望有人能看看我的方法,并指出我正确的方向。感谢帮助。这是我的方法。
// recursive method to evaluate an expression given by string s
int evaluateE(String s)
{
String r1;
String r2;
int result = 0;
int i;
for(i = s.length() - 1; i >= 0; i--)
{
if (s.charAt(i) == '+' || s.charAt(i) == '-')
break;
else if (s.charAt(i) == '*' || s.charAt(i) == '/')
break;
}
r1 = s.substring(0, i);
r2 = s.substring(i + 1, s.length());
//Base case
if(!r1.contains("+") && !r1.contains("-") && !r1.contains("*") && !r1.contains("/") &&
!r2.contains("+") && !r2.contains("-") && !r2.contains("*") && !r2.contains("/"))
return Integer.parseInt(s);
switch (s.charAt(i))
{
case '+':
result = evaluateE(r1) + evaluateE(r2);
break;
case '-':
result = evaluateE(r1) - evaluateE(r2);
break;
case '*':
result = evaluateE(r1) * evaluateE(r2);
break;
case '/':
if (Integer.parseInt(r2) == 0) //if denominator is zero
{
System.out.println("Invalid divisor");
System.exit(1);
}
else
result = evaluateE(r1) / evaluateE(r2);
break;
}
return result;
}
答案 0 :(得分:2)
如果运算符包含运算符,即检查r1+r2
r1
,r2
或String
是否包含运算符,则检查运算符。如果您的r1
只包含1个运算符,则r2
和Integer.parse(s)
都不包含运算符,因此将执行s = r1 + operator + r2
。由于Integer.parse
包含运算符,int evaluateE(String s) {
//Base case
if (!s.contains("+") && !s.contains("-") && !s.contains("*") && !s.contains("/")) {
return Integer.parseInt(s);
}
int i;
for (i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) == '+' || s.charAt(i) == '-') {
break;
} else if (s.charAt(i) == '*' || s.charAt(i) == '/') {
break;
}
}
String r1 = s.substring(0, i);
String r2 = s.substring(i + 1, s.length());
int result = 0;
switch (s.charAt(i)) {
case '+':
result = evaluateE(r1) + evaluateE(r2);
break;
case '-':
result = evaluateE(r1) - evaluateE(r2);
break;
case '*':
result = evaluateE(r1) * evaluateE(r2);
break;
case '/':
int right = evaluateE(r2);
if (right == 0) //if denominator is zero
{
System.out.println("Invalid divisor");
System.exit(1);
} else {
result = evaluateE(r1) / right;
}
break;
}
return result;
}
将引发错误。
要解决此问题,请在该方法中执行任何其他操作之前检查基本案例:
10-3*6/9+4
但忽略了运算符优先级,即它从左到右计算表达式。例如。 (((10-3)*6)/9)+4
被解释为*
。
如果您想将运算符优先级设置为accout,则必须忽略/
或+
,如果字符串中有-
或 // search for '+' and '-' first
for (i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) == '+' || s.charAt(i) == '-') {
break;
}
}
if (i < 0) {
// if '+' and '-' were not found, search for '*' and '/'
for (i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) == '*' || s.charAt(i) == '/') {
break;
}
}
}
。这将要求您修改for循环:
{{1}}
答案 1 :(得分:0)
目前尚不清楚为什么要返回Integer.parseInt(s)
,因为很可能s会有一个运算符+
,-
,*
或/
) 。因此,基本上您正在尝试将"2+3"
转换为int
,这是导致错误的原因。