2012-12-22 8 views
0

J'essaye d'écrire un programme C pour convertir des expressions infixes en postfix et calculer avec des valeurs saisies. Quand j'entre (2 + 14) * 5 j'obtiens (2 14) 5 * + mais ça devrait être 2 14 + 5 *. Donc, mes questions:Comment convertir une expression infixe en une expression postfixée?

  1. Où est-ce que je me suis trompé?
  2. Comment modifier le code pour supprimer des parenthèses au dernier formulaire (postfix)?

Merci pour toute aide.

#include<stdio.h> 
#include<string.h> 
#include<math.h> 

#define oper(x) (x=='+' || x=='-' || x=='*' || x=='/') 

char in[30], post[30], stack[30]; 
int top=-1; 

void push(char x) 
{ 
    stack[++top]=x; 
} 

char pop() 
{ 
    return stack[top--]; 
} 

int precedence(char c) 
{ 
    if (c=='+' || c=='-') 
     return 1; 
    if (c=='*' || c=='/') 
     return 2; 
    if (c=='(') 
     return 3; 
} 

main() 
{ 
    char c; 
    int l,i,j=0,st1[20],k,h,f,eval,s,N; 
    printf("Enter the infix expression : "); 
    scanf("%s",&in); 
    l=strlen(in); 
    for(i=0;i<=l;i++) 
    { 
     if(oper(in[i])) 
     { 
      post[j++]=' '; 
      while(precedence(in[i])<precedence(stack[top])) 
      { 
       post[j++]=stack[top]; 
       pop(); 
       post[j++]=' '; 

      } 
      push(in[i]); 
     } 
     else if(in[i]=='\0') 
     { 
      while(top!=-1) 
      { 
       post[j++]=' '; 
       post[j++]=stack[top]; 
       pop(); 
      } 
     } 
     else 
      post[j++]=in[i]; 
    } 
    post[j]='\0'; 
    printf("Postfix Expression : %s\n",post); 
    i=0;top=-1;f=0;k=0; 
    while(i<j) 
    { 
     if(oper(post[i])) 
     { 
      f=1; 
      c=post[i]; 
      eval=0; 
      switch(c) 
      { 
       case '+': 
        eval=st1[top-1]+st1[top]; 
        break; 
       case '-': 
        eval=st1[top-1]-st1[top]; 
        break; 
       case '*': 
        eval=st1[top-1]*st1[top]; 
        break; 
       case '/': 
        eval=st1[top-1]/st1[top]; 
        break; 
      } 
      top--; 
      st1[top]=eval; 
     } 
     else if(post[i]==' ') 
     { 
      if(f==0) 
      { 
       h=i-k; 
       s=0; 
       while(post[h]!=' ') 
       { 
        N=(int)post[h]; 
        N=N-48; 
        s=s+N*(pow(10,(k-1))); 
        k--; 
        h++; 
       } 
       st1[++top]=s; 
      } 
      k=0; 
     } 
     else 
     { 
      k++; 
      f=0; 
     } 
     i++; 
    } 
    printf("Value : %d\n",st1[top]); 
} 
+0

RPN est plus difficile à faire que d'une approche simple de descente récursive. Êtes-vous obligé d'utiliser la notation polonaise? –

+0

: Bien sûr, je sais que c'est plus difficile mais c'est un sujet de leçon sur la structure des données que puis-je faire? – allstar

+0

Veuillez ne pas utiliser scanf. fgets est la méthode recommandée pour lire stdin. Le type de retour implicite de main est également considéré comme un style incorrect. –

Répondre

1

Je ne l'ai pas regardé dans trop de détails à votre code, mais vous ne semblez pas être manipuler entre parenthèses dans l'entrée d'une manière particulière; ils ont une signification très spécifique: ordre des opérations WRT. Je suppose que votre programme traite les parens comme des chiffres, et est en train d'analyser l'entrée comme (en substituant L et R pour respectivement paren et paren à droite) L2 + (14R * 5), auquel cas la sortie est correcte.

+0

+1 Cela semble essayer d'imiter un analyseur de décalage-réduction simplifié, et je trouve étrange que ')' soit nulle part dans la recherche de précédence. – WhozCraig

-1

Dans la fonction precedence, vous devriez essayer

if((c=='(') || (c==')')) { 
    return 3; 
} 
Questions connexes