-6

演算の順序で簡単な電卓を作ろうとしています。インターネットで読んだところ、RPN (逆ポーランド記法) のアルゴリズムを見つけました。

編集:

例を見てみましょう: 2 * 5 - 3 + 4

わかりました、あなたの両方が言ったように、今すぐチェックしてください:

proc は、数値と演算の両方の文字列配列です。プロシージャは {2, *, 5, -, 3, +, 4} になります

これはコードです:

    int tempt = 0;
    Stack <Double> stc = new Stack <Double>();
    while (tempt < proc.length)
    {
        try
        {
            Double num = Double.parseDouble(proc[tempt]);
            stc.push(num);
            tempt++;
        }
        catch (Exception e)
        {
            char [] stcs = proc[tempt].toCharArray();
            switch (stcs[0])
            {
            case '+':
            {
                double a2 = stc.pop();
                double a1 = stc.pop();
                stc.push(a1 + a2);
                tempt++;
                break;
            }
            case '-':
            {
                double a2 = stc.pop();
                double a1 = stc.pop();
                stc.push(a1 - a2);
                tempt++;
                break;
            }
            case 'x':
            {
                double a2 = stc.pop();
                double a1 = stc.pop();
                stc.push(a1 * a2);
                tempt++;
                break;
            }
            case '÷':
            {
                double a2 = stc.pop();
                double a1 = stc.pop();
                stc.push(a1 / a2);
                tempt++;
                break;
            }
        }

        }

まだ機能しない

どうすればそれを機能させることができますか?助けてください!

4

1 に答える 1

4

アルゴリズムが間違っています。2 * 5 - 3 + 4RPN では、次のように変換されます2 5 * 3 - 4 +。数字と記号を 2 つの別々のリストで別々に扱っている理由がわかりません: 逆ポーランド記法:

2 3 + 4 * === (2 + 3) * 4

その間

2 3 4 + * === 2 * (3 + 4)

あなたのプログラムはほとんど正しいと言われていますが、入力には一連の記号 (値と演算子の両方) を使用する必要があります。これで、シンボルを左から右に読みます。数値の場合は、スタックにプッシュします。If 演算子: 上位 2 つの値をポップし、結果をプッシュします。それでおしまい!


更新: 例

入力:2 5 * 3 - 4 +

スタック:[]

反復 I: (2入力から読み取る)

入力:5 * 3 - 4 +

スタック:[2]

反復 II: (5入力からの読み取り)

入力:* 3 - 4 +

スタック:[2, 5]

反復 III: (*入力から読み取る)

入力:3 - 4 +

スタック: [2 * 5]==[10]

繰り返し IV: (3入力から読み取る)

入力:- 4 +

スタック:[10, 3]

反復 V: (-入力から読み取る)

入力:4 +

スタック: [10 - 3]==[7]

反復 VI: (4入力から読み取る)

入力:+

スタック:[7, 4]

反復 VII: (+入力から読み取る)

入力: `

スタック: [7 + 4]==[11]

結果:(11それ以上の入力はありません。スタック上の唯一の要素が結果です)


更新 2: さあ!

RPNを解釈するプログラムを作成していますが、中置記法を使用しています。この入力で試してください:

String[] proc = new String[]{"2", "5", "x", "3", "-", "4", "+"};

コードには他にもいくつかの欠陥があります (重複、例外駆動のフロー制御、エラー処理なし) が、基本的にはこの入力で動作するはずです。

于 2011-09-30T14:58:55.087 に答える