2

私はこの関数で間違ったものを見つけることができないという問題があります。それはいくつかの入力でうまくいくことがありますが、この入力「6 2/3 – 4 2*+」の例ではうまくいかないことがあります。

public static double Evaluating_postfix_expressions(String postfix) throws Exception{
    StringTokenizer st = new StringTokenizer(postfix);
    int numOF_tokens = st.countTokens();
    for (int i = 1; i <= numOF_tokens; i++) {
        Object term = st.nextToken();
        try { // if it is an operand there is no problem
            float x =  Float.parseFloat((String)term);
            stack.push(x);
        } catch (Exception e) { // it is an operator
            float v1 = (float) stack.pop();
            float v2 = (float) stack.pop();
            switch ((String) term) {
            case "+":
                stack.push(v2 + v1);
                break;
            case "-":
                stack.push(v2 - v1);
                break;
            case "*":
                stack.push(v2 * v1);
                break;
            case "/":
                stack.push(v2 / v1);
                break;
            }
        }
    }
    return (float) stack.pop();
}
4

1 に答える 1

6

入力として誤った演算子を指定したことに注意してください。

6 2 / 3 – 4 2 * +

ここで手書きで入力したバージョンとの違いに注意してください。

6 2 / 3 - 4 2 * +

ハイフンの代わりにダッシュを使用しました-またはその逆:

$ echo -n – | xxd
0000000: e280 93                                  ...
$ echo -n - | xxd
0000000: 2d                                       -
$ 

これは、問題を報告しないキャッチオール例外の問題の一部です。無効な演算子を報告するようにを変更する必要がありますswitch。これにより、この演算子を簡単に見つけることができます。(たまたま面白そうだと思いました。)

于 2012-05-03T02:07:26.627 に答える