通过在线进行一些研究,我发现这是错误是由于尝试从空堆栈弹出一些东西引起的。在我的代码中,我想我确保通过将我的堆栈顶部存储在一个名为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;
}
答案 0 :(得分:0)
在主while循环中的if语句中,你有一些pop()
的调用,而不检查deque是否为空,例如
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 == ')'
(注意单引号)比较两个字符而不是你现在拥有的将字符串字符串与字符串文字进行比较...这可能适用你应该保持的所有数据结构,例如, deque<char> ...
最后拿起any decent introductory C++本书并阅读。你以后会感谢自己。