0

サブルーチンを使用して、次の命令を理解しようとしています。

私は= 1

i <= nの間

v_i がオペランドの場合: v_i を tmp2 にプッシュします。

v_i が演算子の場合: tmp2 の上位 2 つの要素に v_i を適用します。これらを tmp2 の結果に置き換えます。

i = i + 1 tmp2 からの出力結果。

したがって、基本的には、postfix(RPN) 形式で式を計算しようとしています。ここで、数字がオペランド(数値)である場合はいつでもtmp2に転送し、演算子がある場合はtmp2の値で置き換えます。例: 3 5 1 +8 / 14* = 14

その他の問題: 何を書いても、"Exception in thread "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;
}
4

1 に答える 1

0

これは、char 配列の外にある文字にアクセスしようとしていることを意味します。つまり、char 配列の長さが 10 で、11 番目の文字を取得しようとしています。

問題に対するより良いアプローチは、最初に String.split または StringTokenizer StringTokenizerのいずれかを使用して式をトークン化し、次に各トークンをループすることです。

  • トークンがオペランドの場合は Stack にプッシュ--Javaには Stack クラスがあるので、それを使用します。
  • トークンが演算子の場合、スタックからオペランドをポップして操作を実行し、回答をスタックにプッシュします。
于 2015-09-15T17:54:47.890 に答える