2014-11-03 50 views
0
#include <iostream> 
#include <stack> 
#include <string> 

using namespace std; 

int main() 
{ 
    string blah("512+4*+3−"); 
    stack<int> astack; 
    int a=0; 
    int b=0; 
    int result=0; 
    int final=0; 
    for (string::iterator count=blah.begin(); count != blah.end(); count=count+1) 
    { 
     if (isdigit(*count)) 
     { 
      astack.push(*count); 
      cout<<" "<<*count<<" "; 
     } 
     else 
     { 
      a=astack.top(); 
      astack.pop(); 
      b=astack.top(); 
      astack.pop(); 
      if(*count=='+') 
      { 
       result = a+ b; 
      } 
      else if (*count=='-') 
      { 
       result=a-b; 
      } 
      else if(*count=='*') 
      { 
       result=a*b; 
      } 
      astack.push(result);  
     } 
    }  
    final=astack.top(); 
    cout<<final; 
} 

我的問題是每當我運行它時,代碼似乎會分段錯誤。當我試着運行它與運營商評論它堆棧似乎彈出兩個值,我不知道爲什麼用堆棧和迭代器編寫後綴計算器

+0

護理,告訴我們您的調試器導致錯誤報告的行? – 2014-11-03 02:19:23

+0

如果第一個字符不是數字,會發生什麼情況?它將查詢空堆棧的頂部。放置大量'assert'來檢查這些假設,並且可能會陷入錯誤。 – 2014-11-03 02:20:52

+1

那麼,您發佈的'blah'字符串中的「 - 」符號不是負號。此外,不能重複:http://ideone.com/xqQSmM – PaulMcKenzie 2014-11-03 02:29:36

回答

1

正如PaulMcKenzie指出,blah字符串中的負號是某種奇怪的unicode字符,看起來很奇怪像一個正常的減號,但事實並非如此。由於這是一些奇怪的Unicode字符,它實際上是被存儲在一個以上的字節字符串的內存,這意味着你的迭代器,循環迭代的次數比你所期望的!

在聲明blah之後立即輸入cout << blah.length() << endl;,您將看到長度超過了預期的9個字符。

此外,該程序將不輸出,即使上面的問題是固定的正確答案。在對它們進行任何計算之前,您需要將ascii數字字符(整數範圍[48,57])轉換爲等效的整數值。

1

如果您發佈的代碼是實際的代碼,再有就是與您發佈的字符串的問題。

string blah("512+4*+3−"); 

3之後的最後一個字符不是ASCII減號。它是一個Unicode字符0x2212。將其更改爲ASCII減號並重新運行該程序。

什麼可能發生的是,你開始了一個ASCII負,複製文本到其它應用程序,以及應用程序與更美觀尋找字符替換它試圖「看上了」負。然後,您可能已將此應用中的文本複製回源代碼編輯器。