为什么在第一个代码中它没有工作但在第二个工作中? - 反向波兰表示法

时间:2015-01-07 00:45:31

标签: c arrays char postfix-notation rpn

我试图仅使用数字来评估后缀表达式,因此在理解了概念并实现了代码后,我认为这是正确的,但它没有生成正确的答案, 在我做了一些改变之后它起了作用但是在这里我想知道我在第一次做的错误是什么,所以我将来不能重复它!

这两个代码(第一个错误,第二个错误)

#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

1 个答案:

答案 0 :(得分:1)

不知道反向波兰表示法的评估如何工作的人可能无法找出问题所在。你的代码是正确的,但算法是错误的。

我将以32*1+为例:

对于前两个数字,您的代码是正确的,但在计算结果并将其推入堆栈后,麻烦就开始了。 当它遇到操作员时,它将从堆栈中提取的两个数字中的每一个中减去48,并且你的结果是该规则的乘积,这是错误的。