首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在第一种代码中它不起作用,而在第二种代码中起作用?-反向波兰符号

为什么在第一种代码中它不起作用,而在第二种代码中起作用?-反向波兰符号
EN

Stack Overflow用户
提问于 2015-01-07 00:45:30
回答 1查看 81关注 0票数 0

我试着只使用数字来计算后缀表达式,所以在理解了这个概念之后,我提出了代码,我认为它是正确的,它没有产生正确的答案,但是在我做了一些修改之后,它起了作用,但是这里我想知道我在第一次做的错误是什么,所以我不能在将来重复它!

这是两个代码(第一个错误和第二个正确)。

代码语言:javascript
复制
#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;
}

正确的代码

代码语言:javascript
复制
#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+,在infix中的表达式是3*2+1,所以我们将得到正确的答案7

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-07 01:19:43

不知道反向波兰符号的评估是如何工作的人可能找不到这个问题。您的代码是正确的,但算法是错误的。

我将以32*1+为例:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27809758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档