Я попытался оценить постфиксное выражение, используя только цифры, поэтому, поняв концепцию и внедряя код, который, как я думал, был прав, не дал правильных ответов, но после того, как я сделал несколько изменений. работал, но здесь я хочу знать, в чем ошибка, которую я сделал в первой, поэтому я не могу повторить ее в будущем!Почему в первом коде это не сработало, но во втором сработало? - 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+
, которое находится в ноте infix, равно 3*2+1
, поэтому мы получим правильный ответ 7
В первой программе вы иногда записываете коды ascii в 'b' и иногда (как результат выражений) действительные целочисленные значения. – zch
Оба они созрели для неопределенного поведения с соответствующим входом. Независимо от того, что в вашем первом списке кодов все ваши 'b [j-2] = x' не корректируют замененное значение для' b [j-2] 'для повторного включения смещения' 48', остальная часть кода ожидание. в следующий раз, когда это значение используется в операции, оно уже уменьшено на '48', но затем вы делаете это * снова * с выражениями типа' (b [j-2] -48) 'на последующих итерациях. – WhozCraig