개념을 이해 한 후 숫자 만 사용하여 후위 표현식을 평가하려했는데 코드가 올바른지 생각해 보았습니다. 올바른 답변을 생성하지 않았지만 약간 변경 한 후에 일했으나 여기서 내가 처음에했던 실수가 무엇인지 알고 싶다. 그래서 나는 그것을 앞으로 반복 할 수 없다! 첫 번째 코드에서 작동하지 않았지만 두 번째 코드에서 작동 한 이유는 무엇입니까? - 폴란드어 표기법을 바꾸십시오
이
는 두 코드 (오른쪽 첫 번째 잘못과 두 번째)#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
첫 번째 프로그램에서는 종종 아스키 코드를 'b'로 작성하고 때로는 (표현식의 결과로) 실제 정수 값을 작성합니다. – zch
이 두 가지 모두 적절한 입력을 사용하여 정의되지 않은 동작이 발생하는 경우입니다. 그럼에도 불구하고, 첫 번째 코드 목록에서'b [j-2] = x'는'b [j-2]'에 대한 대체 된 값을 한번 수정해서 나머지 코드를 '48'오프셋으로 포함시키지 않습니다 기대하고있다. 그 값이 연산에서 다음에 사용될 때, 그것은 이미'48'에 의해 감소되지만, 후속 반복에서'(b [j-2] -48)'과 같은 표현으로 * 다시 * 수행합니다. – WhozCraig