2016-04-22 9 views
0

Meine Aufgabe war es, int isOperator (char *); Operanden werden gedrückt, und Operatoren erhalten Top, Popped und der Ausdruck wird gedrückt.Stacks - Auswertung von Postfix-Ausdrücken in 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 

Ist etwas falsch mit meiner Implementierung? Hier ist mein intOperator (char *).

int isOperator(char *s){ 

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

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

Hier ist meine Implementierung für Pushing und Popping Operanden und Operatoren.

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

Die "isOperator" -Funktion sollte Compiler-Warnungen geben. Lese sie. Überprüfen Sie den Code in den Zeilen, um die sich die Warnungen drehen. Versuchen Sie zu verstehen, warum Sie die Warnung erhalten. –

+0

Versuchen Sie auch, den Code in der Schleife in der Funktion zu folgen, was macht es? Prüft es alle möglichen Betreiber? –

+0

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

Antwort

1

Eine wesentlich einfachere Implementierung ist dies:

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

Das gibt 1 (true), wenn das erste Zeichen in s ein Operator ist und die zweite ist die Null-Terminator (keinen anderen Inhalt Bedeutung im Anschluss an die Bedienercharakter, für strenge Kontrolle).

Wie für die Stack-Logik, sollten Sie sicherstellen, dass der Stapel nicht leer ist, wenn Sie Pop.