2016-03-05 4 views
-5

Je suis novice en C++ et je veux utiliser une pile pour évaluer une expression donnée en entrée (2 + 3 * 5 + 4 par exemple), contenant uniquement des nombres, + et *. J'ai écrit ce code mais cela me donne une erreur de segmentation: 11. Pourriez-vous s'il vous plaît m'aider à résoudre ce problème ou me donner un indice sur ce qui pourrait être faux? Je vous remercie! (Je remarqué qu'il y avait des questions similaires sur ce site, mais je ne pouvais pas les utiliser pour résoudre mon problème)Pile de notation Postfix C++

#include <iostream> 
#include <stack> 
using namespace std; 

bool highPrecedence(char a, char b){ 
    if((a=='+')&&(b=='*')) 
     return true; 
    return false; 
} 

int main() 
{ 
    char c = 'a'; 
    double x; 
    stack<char> stack; 
    double v[10]; 
    int i=0; 
    double res; 
    while(true) 
    { 
     c = cin.get(); 

     if(c=='\n'){ 
      while(stack.size()!=0){ 
       if (stack.top()=='*'){ 
        double res = v[i]*v[i-1]; 
        i--; 
        v[i]=res; 
        stack.pop(); 
       } 
       if (stack.top()=='+'){ 
        res = v[i]+v[i-1]; 
        i--; 
        v[i]=res; 
        stack.pop(); 

       } 
      } 
      break; 
     } 

     if ('0'<=c && c<='9') 
     { 
      cin.putback(c); 
      cin>>x; 
      cout<<"Operand "<<x<<endl; 
      i=i+1; 
      v[i]=x; 
     } 
     else 
     { 
      if(c!=' ') cout<< "Operator " <<c<<endl; 
      if (stack.size()==0) 
       stack.push(c); 
      else{ 
       while((!highPrecedence(stack.top(),c)) && (stack.size()!=0)){ 
        if (stack.top()=='*'){ 
         double res = v[i]*v[i-1]; 
         i--; 
         v[i]=res; 
         stack.pop(); 
        } 
        if (stack.top()=='+'){ 
         res = v[i]+v[i-1]; 
         i--; 
         v[i]=res; 
         stack.pop(); 

         } 
        } 

       stack.push(c); 
       } 
      } 

     } 


    cout<<v[0]<<endl; 
} 
+0

Avez-vous utilisé un débogueur? – MikeCAT

+0

Veuillez poster un [mcve] au lieu de tout votre code. La page liée contient de l'aide sur la façon de créer un. –

+0

@MikeCAT ummm pas sûr. J'utilise Xcode et le terminal – Silviu

Répondre

1
  • stack.top() est illégale en utilisant si le stack est vide.
    changement while((!highPrecedence(stack.top(),c)) && (stack.size()!=0)){
    à while((!stack.empty()) && (!highPrecedence(stack.top(),c))){
  • La valeur initiali de i n'est pas bon et vous êtes impression variable non initialisée, ce qui a une valeur indéterminée.
    changement int i=0;-int i=-1;
+0

Merci beaucoup. Ça a marché! – Silviu