2015-01-07 2 views
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]; 
      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

+0

첫 번째 프로그램에서는 종종 아스키 코드를 'b'로 작성하고 때로는 (표현식의 결과로) 실제 정수 값을 작성합니다. – zch

+0

이 두 가지 모두 적절한 입력을 사용하여 정의되지 않은 동작이 발생하는 경우입니다. 그럼에도 불구하고, 첫 번째 코드 목록에서'b [j-2] = x'는'b [j-2]'에 대한 대체 된 값을 한번 수정해서 나머지 코드를 '48'오프셋으로 포함시키지 않습니다 기대하고있다. 그 값이 연산에서 다음에 사용될 때, 그것은 이미'48'에 의해 감소되지만, 후속 반복에서'(b [j-2] -48)'과 같은 표현으로 * 다시 * 수행합니다. – WhozCraig

답변

1

역 폴란드어 표기법의 평가가 문제를 파악하지 못할 수도 있음을 알아야합니다. 코드가 맞지만 알고리즘이 잘못되었습니다.

내가 예를 들어 32*1+를 취할 것입니다 :

를 처음 두 번호는 코드가 정확하지만 결과를 계산하고 스택을 누른 후, 문제는 시작합니다. 다음 번에 연산자에서 스택에서 추출한 두 개의 숫자 각각에서 48을 뺀 결과가 그 규칙의 산물이며 잘못된 것입니다.

+0

Thx Meninx, 알겠습니다. – tissa

+0

처음 두 피연산자 때문에 약간 혼란 스럽습니다! 언제든지! –

관련 문제