簡體   English   中英

出隊迭代器不可取消

[英]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);

這些很可能是無效訪問的來源。 通常,您應該嘗試使用gdbvalgrind --tool=memcheck ,它們將向您顯示錯誤源。 還是其他任何調試器...

另外,如果令牌是我想應該的單個字符,則將其設為char而不是char * 然后在令牌比較中使用token == ')' (請注意單引號),它比較兩個字符,而不是現在比較將char指針與字符串文字比較的字符...這可能適用於所有您還維護應成為的內容,例如deque<char> ...

最后,閱讀並閱讀所有不錯的C ++入門書。 稍后您將感謝您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM