0

我正在尝试使用子程序来理解以下指令:

我 = 1

而我<= n

如果 v_i 是操作数:将 v_i 推送到 tmp2。

如果 v_i 是一个运算符:将 v_i 应用于 tmp2 的前两个元素。将这些替换为 tmp2 中的结果。

i = i + 1 tmp2 的输出结果。

所以基本上我正在尝试以后缀(RPN)形式计算一些表达式。在这里,我希望每当数字是要转移到 tmp2 的操作数(数字),并且当有运算符时,它会被 tmp2 中的值替换。例如 3 5 1 +8 / 14* = 14

其他问题:无论我写什么,我都会收到“线程“主”java.lang.StringIndexOutO ....中的异常”错误。v_i 是数字或运算符或括号。

提前致谢!

我的代码:

static int eval(String postfix){
    int  result = 0;
    String temp2 ="";

    for (int i=0 ; i<postfix.length(); i++) {
        if (postfix.charAt(i)  !=')' && postfix.charAt(i)!= '(' && postfix.charAt(i)!= p(infix.charAt(i)))
            temp2 += postfix.charAt(i);

        int num1,num2;
        char operator;

            do { 
                i++;            
            } while ( Character.isDigit(postfix.charAt(i)));

            num1 = Integer.parseInt(postfix.substring(0,i));
            operator = postfix.charAt(i++);
            num2 = //Double.parseDouble(expression.substring(i));
                Integer.parseInt(postfix.substring(i+1));



            result = num1 + num2;
            result = num1 - num2;
            result = num1 * num2;
            result = num1 / num2;

            switch (operator) {

            case '+' : result = num1 + num2; break;
            case '-' : result = num1 - num2; break;
            case '*' : result = num1 * num2; break;
            case '/' : result = num1 / num2; break;



            }


    }




    return result;
}
4

1 回答 1

0

这意味着您正在尝试访问 char 数组之外的字符,即 char 数组的长度为 10,并且您正在尝试获取第 11 个字符。

解决问题的更好方法是首先使用 String.split 或 StringTokenizer StringTokenizer对表达式进行标记,然后遍历每个标记:

  • 如果令牌是推入堆栈的操作数——Java 有一个堆栈类,所以使用它。
  • 如果 token 是运算符,则从堆栈中弹出操作数并执行操作,然后将答案推回堆栈。
于 2015-09-15T17:54:47.890 回答