[英]Dequeue iterator not dereferencable
通過在線進行一些研究,我發現這是由於嘗試從空堆棧中彈出某些內容引起的錯誤。 在我的代碼中,我認為我試圖通過將堆棧的頂部存儲在名為c
的臨時字符串中來確保不會發生此確切的事情,但是由於某種原因,該錯誤不斷發生。 這是一個與將中綴符號轉換為后綴符號有關的項目。 當我輸入1+2+3
,我應該得到12+3+
,但是會出現此錯誤。 錯誤發生在優先while循環中。
stack <string> InfixToPostfix(char * expr)
{
// YOUR CODE STARTS HERE!
char* token;
stack<string> s;
string postfix;
stack<string> p;
// use stack s to manipulate the infix to postfix
s.push("(");
token = strtok (expr," "); // get the first token
while(!s.empty())
{
if(token=="(")
{
s.push(token);
}
else if(token==")")
{
string c=s.top();
s.pop();
while(c != "(")
{
postfix += c + " ";
c = s.top();
s.pop();
}
}
else if(isNumber(token))
{
postfix+=token;
}
else
{
while(precedence(s.top())>=precedence(token))
{
//put on bottom if need be
string c = s.top();
s.pop();
postfix += c;
postfix += " ";
}
s.push(token);
}
token = strtok(NULL, " "); // use blanks as delimiter
if (token == NULL) // no more tokens, exit the loop
break;
}
p.push(postfix);
return p;
}
在主while循環內的if語句內,您對pop()
進行了一些調用,例如不檢查雙端隊列是否為空。
while(c != "(") {
postfix += c + " ";
c = s.top();
s.pop();
}
這可能應該是:
while(c != "(" && !s.empty()) {
}
和下面一樣
while(precedence(s.top())>=precedence(token))
{
//put on bottom if need be
string c = s.top();
s.pop();
postfix += c;
postfix += " ";
}
s.push(token);
這些很可能是無效訪問的來源。 通常,您應該嘗試使用gdb
或valgrind --tool=memcheck
,它們將向您顯示錯誤源。 還是其他任何調試器...
另外,如果令牌是我想應該的單個字符,則將其設為char
而不是char *
。 然后在令牌比較中使用token == ')'
(請注意單引號),它比較兩個字符,而不是現在比較將char指針與字符串文字比較的字符...這可能適用於所有您還維護應成為的內容,例如deque<char> ...
最后,閱讀並閱讀所有不錯的C ++入門書。 稍后您將感謝您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.