0

数字のみを使用して後置式を評価しようとしたので、概念を理解してコードを実装した後、正しいと思いましたが、正しい答えを生成しませんでしたが、いくつかの変更を加えた後、機能しましたが、ここで知りたいです私が最初に犯した間違いは何ですか?

これらは 2 つのコードです (最初の 1 つは間違っていて、2 番目のコードは正しいです)。

#include <stdio.h>
#include <string.h>

int main()
{
    char s[100];
    int b[100]={0};
    int x=0,j=0,i=0;
    scanf("%s",s);
    for (i=0; i<strlen(s); i++)
    {
        if(s[i]>=48 && s[i]<=57)
        {
            b[j]=s[i];
            j++;
        }
        else
        {
            if (s[i]=='+')
            {
                x=(b[j-1]-48) + (b[j-2]-48);
                b[j-2]=x;
                j--;
            }
            else if (s[i]=='-')
            {
                x=(b[j-2]-48) - (b[j-1]-48);
                b[j-2]=x;
                j--;
            }
            else if (s[i]=='*')
            {
                x=(b[j-1]-48) * (b[j-2]-48);
                b[j-2]=x;
                j--;
            }
            else
            {
                x=(b[j-2]-48) / (b[j-1]-48);
                b[j-2]=x;
                j--;
            }

        }

    }
    printf("%d",b[0]);

    return 0;
}

正しいコード

#include <stdio.h>
#include <string.h>

int main()
{
    char s[100];
    int b[100]={0};
    int x=0,j=0,i=0;
    scanf("%s",s);
    for (i=0; i<strlen(s); i++)
    {
        if(s[i]>=48 && s[i]<=57)
        {
            b[j]=s[i]-48; // modified
            j++;
        }
        else
        {
            if (s[i]=='+')
            {
                x=(b[j-1]) + (b[j-2]); //modified
                b[j-2]=x;
                j--;
            }
            else if (s[i]=='-')
            {
                x=(b[j-2]) - (b[j-1]); // modofied
                b[j-2]=x;
                j--;
            }
            else if (s[i]=='*')
            {
                x=(b[j-1]) * (b[j-2]); //modified
                b[j-2]=x;
                j--;
            }
            else
            {
                x=(b[j-2]) / (b[j-1]); // modified
                b[j-2]=x;
                j--;
            }

        }

    }
    printf("%d",b[0]);

    return 0;
}

プログラムをテストするに32*1+は、中置記法のような逆ポーランド記法で式を入力する必要3*2+1があるため、正しい答えが得られます7

4

1 に答える 1

1

逆ポーランド記法の評価がどのように機能するかを知らない人は、問題を理解できないかもしれません。あなたのコードは正しいですが、アルゴリズムが間違っています。

32*1+例として取り上げます:

最初の 2 つの数値については、コードは正しいですが、結果を計算してスタックにプッシュした後、問題が発生します。次に演算子に遭遇すると、スタックから抽出された 2 つの数値のそれぞれから 48 が減算され、結果はその規則の積になりますが、これは間違っています。

于 2015-01-07T01:19:43.817 に答える