2017-05-24 4 views
0

I fait un programme qui change de notation infix en notation postfixe avec l'aide de la pile en C.réponse incorrecte à partir d'un programme (infix notation-> notation postfixe) en C

I fait une fonction qui imprime le résultat de la postfixe notation (de l'infixe notaton). Mais, le résultat d'une notation est faux.

Cela devrait être «195» mais son résultat est «-61».

Les résultats des autres notations sont corrects, mais seule la notation (op2) a ce problème.

Que dois-je faire pour résoudre ce problème?

Ceci est mon code:

typedef char element; 

typedef struct { 
    element stack[MAX_STACK_SIZE]; 
    int top; 
} StackType; 


void init(StackType *s) { 
    s->top = -1; 
} 

int is_empty(StackType *s) { 
    return (s->top == -1); 
} 

int is_full(StackType *s) { 
    return (s->top == (MAX_STACK_SIZE - 1)); 
} 


void push(StackType *s, element item) { 
    if (is_full(s)) { 
     fprintf(stderr, "FULL STACK ERROR\n"); 
     return; 
    } 
    else s->stack[++(s->top)] = item; 
} 

element pop(StackType *s) { 
    if (is_empty(s)) { 
     fprintf(stderr, "EMPTY STACK ERROR\n"); 
     exit(1); 
    } 
    else return s->stack[(s->top)--]; 
} 


int eval(char exp[]) { 
    int op1, op2, value, i = 0; 
    int len = strlen(exp); 
    char ch; 
    StackType s; 
    init(&s); 
    for (i = 0; i < len; i++) { 
     ch = exp[i]; 
     if (ch != '+' && ch != '-' && ch != '*' && ch != '/') { 
      value = ch - '0';   
      push(&s, value); 
     } 
     else {       
      op2 = pop(&s); 
      op1 = pop(&s); 
      switch (ch) {    
      case '+': push(&s, op1 + op2); break; 
      case '-': push(&s, op1 - op2); break; 
      case '*': push(&s, op1 * op2); break; 
      case '/': push(&s, op1/op2); break; 
      } 
     } 
    } 
    return pop(&s); 
} 

char* infix_to_postfix(char exp[]) { 
    int i = 0, j = 0; 
    char ch, top_op; 
    int len = strlen(exp); 
    char *ex = (char *)malloc(sizeof(char)*(len + 1)); 
    StackType s; 

    init(&s); 
    for (i = 0; i < len; i++) { 
     ch = exp[i]; 
     switch (ch) { 
     case '+': case '-': case '*': case '/': 
      while (!is_empty(&s) && (prec(ch) <= prec(peek(&s)))) { 
       ex[j++] = pop(&s); 
      } 
      push(&s, ch); 
      break; 
     case '(':  
      push(&s, ch); 
      break; 
     case ')':  
      top_op = pop(&s); 
      while (top_op != '(') { 
       ex[j++] = top_op; 
       top_op = pop(&s); 
      } 
      break; 
     default: 
      ex[j++] = ch; 
      break; 
     } 
    } 
    while (!is_empty(&s)) { 
     ex[j++] = pop(&s); 
    } 
    ex[j] = NULL;   
    return ex; 
} 

void main() { 
    char *op1 = "(9-(3+2))*3+4*((4+2)/3)-1"; 
    char *op2 = "(4*5-3)/3+((2+5*7)-8+9)*5";   
    char *op3 = "7*3-7-4+1/3+6-8*2"; 
    char *pos1, *pos2, *pos3; 

    pos1 = infix_to_postfix(op1); 
    pos2 = infix_to_postfix(op2); 
    pos3 = infix_to_postfix(op3); 

    printf(" Result : %d\n", eval(pos1)); 
    printf(" Result : %d\n", eval(pos2)); 
    printf(" Result : %d\n", eval(pos3)); 
} 

[RESULTAT]

Résultat: 19

Résultat: -61 // Cela devrait être '195'.

Résultat: 0

+4

Non lié à votre problème, mais même si les chaînes ont une terminaison nulle, cela ne signifie pas NULL. 'NULL' est utilisé pour les pointeurs NULL *. Le caractère null-termination est soit «\ 0» soit son équivalent entier «0». –

+5

En ce qui concerne votre problème, s'il vous plaît prendre le temps de lire sur [comment déboguer de petits programmes] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/), et apprendre comment utiliser un débogueur pour parcourir votre code ligne par ligne tout en surveillant les variables et leurs valeurs. Aussi, je vous recommande d'imprimer par ex. 'pos2' pour s'assurer que l'expression postfix est correcte. –

+5

Hmm ... intéressant que «-61 + 256 == 195». Débordement signé? – 4386427

Répondre

3

L'indice est 61+195 = 256. Ce qui signifie que quelque part, vos calculs sont enregistrés dans des caractères. On dirait que c'est element.

typedef element int; 
+0

Thak vous! J'ai changé 'char' en 'int' et ça marche bien. J'oublie que je n'ai pas changé la partie pour faire le programme ... – starrykss