2016-03-05 70 views
-5

我是C++新手,我想使用堆棧來評估作爲輸入給出的表達式(例如2 + 3 * 5 + 4),僅包含數字+和*。我寫了這段代碼,但它給了我分段錯誤:11.你能幫我解決這個問題,或給我一個關於什麼可能是錯誤的提示嗎?謝謝! (我注意到有這個網站類似的問題,但我不能用它們來解決我的問題)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

您是否使用調試器? – MikeCAT

+0

請發佈[mcve]而不是所有的代碼。鏈接頁面包含如何創建一個幫助。 –

+0

@MikeCAT嗯,不確定。我使用Xcode和終端 – Silviu

回答

1
  • 使用stack.top()是非法的,如果stack是空的。
    變化while((!highPrecedence(stack.top(),c)) && (stack.size()!=0)){
    while((!stack.empty()) && (!highPrecedence(stack.top(),c))){
  • i的initiali值是不好的,要打印未初始化的變量,它具有不確定的值。
    更改int i=0;int i=-1;
+0

非常感謝。有效! – Silviu