2016-04-22 2 views
0

Моя задача - реализовать int isOperator (char *); Операнды получают Push, а операторы получают Top, Popped и выражения выталкиваются.Стеки - оценка постфиксных выражений в C

Example: 
    6 5 2 3.14 + 8 * + 3 + * 
    Pushing: 6.000000 
    Pushing: 5.000000 
    Pushing: 2.000000 
    Pushing: 3.140000 
    Pushing: 2.000000+3.140000=5.140000 

Есть ли что-то не в порядке с моей реализацией? Вот мой intOperator (char *).

int isOperator(char *s){ 

int i; 
char Ops[] = { '+', '-', '*', '/' }; 

for (i = 0; i < 4; i++) 
{ 
    if (s == Ops[i]) 
     return (1); 
    return (0); 
} 
} 

Вот моя реализация для толкания и выскакивания операндов и операторов.

S = CreateStack(); 
n = sizeof(postfixExpression)/sizeof(postfixExpression[0]); // Compute array size 
for (i = 0; i<n; i++){ // Print elements of postfix expressions 
    printf("%s ", postfixExpression[i]); 
} 
printf("\n"); 

for (i = 0; i<n; i++){ 

    if (isalnum(postfixExpression[i])){ 
     Push(atof(postfixExpression[i]), S); 
     printf("Pushing: %d", atof(postfixExpression[i])); 
    } 
    else if (isOperator(postfixExpression[i])) 
    { 
     rightOperand = Top(S); 
     Pop(Top(S)); 
     leftOperand = Top(S); 
     Pop(Top(S)); 

     switch (isOperator(postfixExpression[i])){ 
     case '+': 
      Push(leftOperand + rightOperand, S); 
      printf("Pushing: %d+%d=%d", leftOperand, rightOperand, leftOperand + rightOperand); 
      break; 
     case '-': 
      Push(leftOperand - rightOperand, S); 
      printf("Pushing: %d-%d=%d", leftOperand, rightOperand, leftOperand - rightOperand); 
      break; 
     case '*': 
      Push(leftOperand * rightOperand, S); 
      printf("Pushing: %d*%d=%d", leftOperand, rightOperand, leftOperand * rightOperand); 
      break; 
     case '/': 
      Push(leftOperand/rightOperand, S); 
      printf("Pushing: %d/%d=%d", leftOperand, rightOperand, leftOperand/rightOperand); 
      break; 
     default: 
      break; 
     } 

    } 
    else 
     break; 
} 

printf("%s\n", S); 
DisposeStack(S); 
return 0; 
+1

Эта функция 'isOperator' должна давать вам предупреждения компилятора. Читай их. Проверьте код в строке (-ях), о которой идет речь. Попытайтесь понять, почему вы получаете предупреждение. –

+0

Кроме того, попробуйте следовать по коду в цикле функции, что он делает? Проверяет ли он все возможные операторы? –

+0

'if (s == Ops [i])' -> 'if (* s == Ops [i])', 'if (isalnum (postfixExpression [i])) {' -> 'if (isdigit (* postfixExpression [i])) {' – BLUEPIXY

ответ

1

Намного проще реализация заключается в следующем:

int isOperator(char *s) 
{ 
    return strchr("+-*/", s[0]) && s[1] == '\0'; 
} 

Это возвращает 1 (истина), если первый символ в s является оператором, а второй является нуль-терминатор (не означает никакого другого содержания, следующего за символ оператора, для строгой проверки).

Что касается логики стека, вы должны убедиться, что стек не пуст, когда вы поп.