2011-10-11 8 views
0

J'essaie de comprendre ce code. Qu'est-ce qu'il fait postfix l'évaluation de l'expression. J'ai de la difficulté à comprendre le code. Je serai très reconnaissant si quelqu'un peut m'aider.Comprendre le code d'évaluation de l'expression postfixe

#include <iostream> 
#include <cstring> 
#include <stack> 
using namespace std; 
int main() 
{ 


    //suppose a contains the string.. 
    //n is the length of string... 
    char a[10]="A+B/C"; 
    int n = strlen(a) 
    stack<int>s; 
    for (int i=0;i<n;i++) 
    { 
     if (a[i]=='+') 
     { 
      s.push(s.pop()+s.pop()); 
      int temp1 = s.top(); 
      s.pop(); 
      int temp2 = s.top(); 
      s.pop(); 
      s.push(temp1 * temp2); 
     } 
     if (a[i]=='*') 
      s.push(s.pop() * s.pop()); 

     if ((a[i]>='0') && (a[i]<='9')) 
      s.push(0); 
     while ((a[i]>='0') && (a[i]<='9')) 
      s.push(10*s.pop()+(a[i++]-'0')); 
    } 

    cout<<s.pop()<<endl; 

    return 0; 
} 

Merci d'avance.

+1

avez-vous écrit cet exemple pour 'a'? parce que ce n'est pas un postfix. –

+0

Quelle est la question? – AJG85

+0

stack :: pop() est une fonction vide. Ce code est un gâchis. Il suffit de chercher une calculatrice postfix sur SO et vous trouverez quelques douzaines (meilleurs) extraits de ce – sehe

Répondre

1

This site semble être une bonne ressource sur ce qui se passe ici, mais l'expression devrait utiliser des chiffres, pas des lettres.

Dites que vous avez l'expression d'infixe 1 + 2 * 3-4 * 5. Le suffixe correspondant serait 123 * + 45 * -. D'abord, vous commencez par balayer la chaîne de gauche à droite. Les trois premiers nombres sont des opérandes donc ils seront stockés sur la pile dans l'ordre 1 (en bas), 2 (au milieu), 3 (en haut). Ensuite, il y a un opérateur *. Pour résoudre ce problème, écartez les deux premiers opérandes de la pile et multipliez-les (le premier est l'opérande droit et le second est le gauche). Cela va évaluer à 2 * 3 = 6, et 6 sera stocké sur la pile, ce qui en fait 1, 6.

Ensuite, il y a un opérateur +. 1 et 6 sont sautés et ajoutés et 7 sont stockés sur la pile. Après cela, 4 et 5 sont également poussés sur la pile (7, 4, 5). Le caractère suivant est un autre opérateur *, donc il évalue 4 * 5 = 20 et pousse 20 sur la pile (7, 20).

Enfin, il existe un opérateur -. 7 et 20 sont sautés et évalués comme 7-20 = (- 13). Ceci est poussé sur la pile et est prêt à apparaître comme votre réponse finale.

Espérons que cela aide à dissiper toute confusion (en supposant que j'ai lu votre question correctement).