2017-07-12 7 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#define max 10 
void eval(char []); 
struct stack 
{ 
    int top; 
    int info[max]; 
}; 
int main() 
{ 
    char inf[20]; 
    printf("\n Enter the string "); 
    scanf("%s",inf); 
    printf("%s",inf); 
    eval(inf); 
    return 0; 
} 
void eval(char inf[]) 
{ 
    struct stack s; s.top=-1; 
    int instack(char); 
    int incoming(char); 
    void push(struct stack *, char); 
    char pop(struct stack *); 
    int i,j=0,ip,is,k; 
    char pst[20],ch,x; 
    for(i=0;i<strlen(inf);i++) 
    { 
     ch=inf[i]; 
     if(isdigit(ch)) 
     { 
      pst[j]=ch; 
      j++; 
     } 
     else if(ch==')') 
     { 
      while(x=pop(&s)!='(') 
      { 
       pst[j]=x; j++; 
      } 
     } 
     else if(s.top==-1) 
     { 
       push(&s,ch); 
     } 
     else 
     { 
       ip=incoming(ch); 
       is=instack(s.top); 
       if(ip>is) 
       { 
        push(&s,ch); 
       } 
       else 
       { 
       while((incoming(k=pop(&s))<(instack(s.top)))) 
       { 
        pst[j]=pop(&s); 
        j++; 
       } 
       push(&s,ch); 
       } 
     } 
    } 
    while(s.top!=-1) 
    { 
     pst[j]=pop(&s); 
     j++; 
    } 
    pst[j]='\0'; 
    printf("\n%s",pst); 
} 
void push(struct stack *s,char ch) 
{ 
    s->top=s->top+1; 
    s->info[s->top]=ch; 
} 
char pop(struct stack *s) 
{ 
    char ch; 
    ch=s->info[s->top]; 
    s->top=s->top-1; 
    return ch; 
} 
int incoming(char ch) 
{ 
    switch(ch) 
    { 
     case '+': 
     case '-': return 1; break; 
     case '*': 
     case '/': return 2; break; 
     case '(': return 4; break; 
    } 
} 
int instack(char ch) 
{ 
    switch(ch) 
    { 
     case '+': 
     case '-': return 1;break; 
     case '*': 
     case '/': return 2; break; 
     case '(': return 0; break; 
    } 
} 

La sortie que je reçois pour le i/p- (5 + 6) * (3-2) est 56? 32? (Astérisque) . J'utilise le compilateur GCC sur une machine Linux. La sortie consiste en? et ? inplace d'un opérateur + et a -. Les entrées simples comme 5 + 6 sont converties correctement. Le résultat que j'obtiens est 56+. Seules les entrées avec crochets font ceux-ci? apparaître.Caractères inconnus à la place des opérateurs dans la sortie pour la conversion Infix vers Postfix

+0

Avez-vous essayé de parcourir le code ligne par ligne dans un débogueur? Peut-être devriez-vous prendre le temps de lire [Comment déboguer de petits programmes] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) par Eric Lippert. –

+2

Activez vos avertissements, alors vous réaliserez (probablement) que 'x = pop (& s)! = '(' 'Ne fait pas ce que vous attendez en raison de la priorité de l'opérateur. – Ctx

Répondre

0

Une erreur très mineure, while(x=pop(&s)!='(') le changer en while((x=pop(&s)) !='('). Et maintenant, c'est donner la sortie désirée par vous. :)