在Postfix(RPN)Java中评估数学表达式。没有堆栈,只有字符串

时间:2015-09-15 16:41:47

标签: java regex infix-notation calc rpn

我试图使用子程序了解以下说明:

i = 1

而我< = n

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

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

i = i + 1  输出结果来自tmp2。

所以基本上我试图以后缀(RPN)形式计算一些表达式。这里我希望每当数字是要转移到tmp2的操作数(数字)时,操作员在tmp2中通过valuse重新操作它。例如3 5 1 +8 / 14 * = 14

其他问题:无论我写什么,我得到"线程中的异常" main" 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;
}

1 个答案:

答案 0 :(得分:0)

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

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

  • 如果令牌是操作数推入Stack - Java有一个Stack类,所以使用它。
  • 如果令牌是操作员,从堆栈弹出操作数并执行操作,将答案推回堆栈。