2015-01-07 3 views
0

Я попытался оценить постфиксное выражение, используя только цифры, поэтому, поняв концепцию и внедряя код, который, как я думал, был прав, не дал правильных ответов, но после того, как я сделал несколько изменений. работал, но здесь я хочу знать, в чем ошибка, которую я сделал в первой, поэтому я не могу повторить ее в будущем!Почему в первом коде это не сработало, но во втором сработало? - 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

+0

В первой программе вы иногда записываете коды ascii в '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

Это немного запутанно из-за первых двух операндов! в любой момент ! –

Смежные вопросы