递归地评估算术表达式

时间:2015-04-10 15:18:12

标签: java recursion

我需要帮助通过递归来评估算术表达式(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;

}

2 个答案:

答案 0 :(得分:2)

如果运算符包含运算符,即检查r1+r2 r1r2String是否包含运算符,则检查运算符。如果您的r1只包含1个运算符,则r2Integer.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,这是导致错误的原因。