-3
String hello = "44+"
int result=0, top=-1;
int []stack = new int[hello.length()];
for(int i=0 ; i<hello.length() ; i++)
{
    char c = s.charAt(i);
    if(c >= '0' && c <= '9')
        stack[++top]=(int)(c-'0');
    else
    {
        int x=stack[top--]; //pop
        int y=stack[top--]; //pop
        switch(c)
        {
            case '+' : result = x + y;
                break;
            case '-' : result = y - x;
                break;
            case '*' : result = x * y;
                break;
            case '/' : result = y / x;
                break;
            default : result = 0;
        }
        stack[++top]=result; //push
    }
}
result = stack[top--]; //pop
return result;

44以上のストア8->戻り結果が発生し、メインに印刷すると、出力として8が返されます。これは正しいです。

このコードを置き換えると

    stack[++top]=(int)(c-'0');

これで

    stack[++top]=(int)(c);

出力は次のようになります=104.. 2番目のコードは私には正しいように見えますが、正しい出力が得られません

私の質問は

  1. なぜc-'0'使用されるのか、それcだけではないのですか?
  2. なぜcase '-' : result = y - x使用され、使用されないのx - yですか?
  3. なぜcase '/' : result = y / x使用され、使用されないのx / yですか?

前もって感謝します

4

4 に答える 4

1

48は「0」のASCIIです。文字「0」、「1」、「2」、「3」、「4」、「5」、「6」、「7」、「8」、「9」のASCII値は48、49、50です。 、...、57

したがって、48(-'0'と同じ)を引くことにより、数字の文字をその値に変換できます。

c - '0' と同じです c- 48

于 2012-12-29T22:38:06.817 に答える
1

cは文字コードで、Cでは基本的に整数です。文字ゼロ'0'も同様ですが、数値48(ASCIIコードゼロ)でもあります。したがって、数字をC言語の整数に変換するには、likeというコードc - '0'がよく使用されます。

言い換えると、C(ASCIIエンコーディングを使用するコンピューター)とまったく同じですchar c = '0';char c = 48;

xとの順序についてはy、まあ、xスタックのy一番上、つまり最後にプッシュされ、2番目に上だったので、使用する順序はどれでも...通常の順序にしたい場合、つまり文字列は、を"yx/"意味します。y / xあなたはそれをそのように書く必要があります。

于 2012-12-29T22:40:27.727 に答える
1

このコードにはバグがあり、そのうちの1つは次
のとおりです。

char c = s.charAt(i);

する必要があります:

char c = hello.charAt(i);

Postfix Expression このコードは、を取り、合計を計算することを想定しています

44+  is 4+4 

合計を計算するには、スタックを使用する必要があります(上記のコードで示されています)。

44+は2つのpop操作(x=4とy=4)によってスタックから取得され、操作は3番目のポップです+

数値は文字列から文字として取得されるため、intに変換する必要があります。ASCIIテーブルを確認すると、「0」が48であることがわかります。したがって、文字「4」を取得すると、52で計算されます。 '4'-'0'は、要求に応じて4である52-48を取得します。

操作の順序については、操作に応じてPostfix Expression1つの順序で実行する必要があります。

xy+ --> x+y
xy- --> x-y
xy/ --> x/y
xy* --> x*y

他の方法(y/xたとえば)でそれを行うのはバグです。

于 2012-12-29T22:41:16.323 に答える
1

文字列(たとえば、「44+」)には文字のセットが含まれます。文字列内の各文字は、特定のコードまたは値で表されます。文字列「ABC」は、値65,66,67(10進数)で表されます。文字列「ABC0123456789」は、それぞれ値65、66、67、48、49、50、51、52、53、54、55、56、57で表されます。したがって、数字の文字('0'から'9')の数値を取得するには、文字のコードから48を引く必要があります。

2番目と3番目の質問について:Yはスタックにプッシュされた最初の数字であり、Xはスタックにプッシュされた2番目の数字です。操作は1桁目と2桁目の間であると想定されているため、YXとY / Xである必要があります(Y+XとY*Xでもある必要がありますが、この場合、順序によって結果は変わりません)。

このコードは、2桁を超える場合、または文字列が例のように正確にフォーマットされていない場合はうまく機能しないことに注意してください。

于 2012-12-29T22:58:22.720 に答える