为什么在第一个代码中它不起作用但在第二个代码中起作用? - 反向波兰符号
Why in the first code it didn't work but in the second worked ? - Reverse Polish Notation
我尝试仅使用数字来评估后缀表达式,因此在理解了概念并实施了我认为正确的代码之后,它没有生成正确的答案,但是
在我做了一些更改后它起作用了,但在这里我想知道我第一次犯的错误是什么,所以我以后不能再犯了!
这是两个代码(第一个错误,第二个正确)
#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
不了解Reverse Polish Notation求值原理的人可能想不通。你的代码是正确的,但是算法是错误的。
我以32*1+
为例:
对于前两个数字,您的代码是正确的,但在计算结果并将其压入堆栈后,问题就开始了。
下次遇到运算符时,它将从堆栈中提取的两个数字中的每一个减去 48,而你的结果是该规则的乘积,这是错误的。
我尝试仅使用数字来评估后缀表达式,因此在理解了概念并实施了我认为正确的代码之后,它没有生成正确的答案,但是 在我做了一些更改后它起作用了,但在这里我想知道我第一次犯的错误是什么,所以我以后不能再犯了!
这是两个代码(第一个错误,第二个正确)
#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
不了解Reverse Polish Notation求值原理的人可能想不通。你的代码是正确的,但是算法是错误的。
我以32*1+
为例:
对于前两个数字,您的代码是正确的,但在计算结果并将其压入堆栈后,问题就开始了。 下次遇到运算符时,它将从堆栈中提取的两个数字中的每一个减去 48,而你的结果是该规则的乘积,这是错误的。