1

解読、説明、改善のための推奨事項を提供するためのコードスニペットが提供されました。私はそれが機能すると言われ、それをテストするためのコードを実行することはできません。私はそれをかなり理解していますが、私が理解していることが正しいことを確認するために誰かがそれを実行する必要があります、そして私が理解していないことを説明するのに助けを求めてください。私はたくさんの研究をしていて、まだいくつかあります質問。

このコードは、乗算と加算のみを使用する接尾辞式を読み取るために使用される実装です。次に、結果をスタックに保存しながら式を評価します。次に、結果を出力します。オペランドはスタックにプッシュされ、演算子を読み取るときに、スタックから上位2つのオペランドがポップされて計算が実行され、結果がスタックに格納されます。

プログラムは、整数と演算子が空白などの文字で区切られていることを前提としていますが、入力の合法性はまったくチェックしていません。

 public static void main(String[] args)
{
    char[] a = args[0].toCharArray();
    int N =a.length;
    intStack s = new intStack();
    for (int i = 0; i<N; i++)
    {
        if (a[i]=='+')
        {
            s.push(s.pop() + s.pop());
        }
        if (a[i]=='*')
        {
            s.push(s.pop() * s.pop());
        }
        if ((a[i] >= '0') && (a[i] <= '9'))
        {
            s.push(0);
        }
        while ((a[i] >= '0') && (a[i] <= '9'))
        {
            s.push(10*s.pop() + (a[i++]-'0'));
        }
        Out.println(s.pop() + "");
    }
}

修正後の式の例:2 3 5 + * = 16

最後のifステートメントとwhileループに関しては混乱しています。

したがって、最初に0〜9の数字をプッシュすると、#0が格納され、その0がポップアウトされ、10で乗算されて、intに変換される次の数字(存在する場合)に追加されます。結果をスタックにプッシュバックしますか?もしそうなら、なぜ0がスタックにプッシュされるのですか?

最初の0〜9の番号付き文字をintデータ型に変換し、それをスタックにプッシュしてから、whileループに移動するべきではありませんか?

次に、Whileループで、配列を読み取り、0〜9の番号付き文字をintデータ型に変換し続け、異なる文字が読み取られるまでスタックにプッシュしますか?

また、whileループのどこでint iをインクリメントしているのか、次の文字に進むためにwhileループから抜け出しているのかわかりませんか?

4

1 に答える 1

1

ゼロの最初のプッシュは少し混乱します。そこで何が起こっているのかを理解するための鍵は、それiが増加していないことを観察することです。コードが、たとえば、'4'の最初の桁であるを検出する"42"と、ifステートメントはゼロをプッシュします。次に、ループはすぐにそれをポップし、10を掛け、追加4し、プッシュバックします。iは次の文字(つまり2)に進み、ループがポップ4し、10を掛け、加算2し、保存します42-目的の結果。

コードにエラーがあります。式が数値で終わると、インデックスの範囲外の例外が発生します。たとえば42、有効な後置式(演算子がなくても大丈夫ですよね?)は、内側のループが文字列の終わりを超えて進み、例外が発生します。

于 2013-01-26T23:27:26.270 に答える