这是我得到的错误:
在抛出'std :: length_error'
的实例后终止调用what():basic_string :: _ S_create
中止(核心倾销)
我正在阅读一个大约有50行的文件。你在下面的代码中看到了这个问题吗?
using namespace std;
bool areParenthesesBalanced(const std::string& expr)
{
stack<char> s;
char a, b, c;
for (int i=0; i<expr.length(); i++)
{
if (expr[i]=='(' || expr[i]=='[' || expr[i]=='{')
{
s.push (expr[i]);
}
else
{
switch (expr[i])
{
case ')':
a = s.top();
s.pop();
if (a=='{' || a=='[')
cout<<"Not Balanced";
break;
case '}':
b = s.top();
s.pop();
if (b=='(' || b=='[')
cout<<"Not Balanced";
break;
case ']':
c = s.top();
s.pop();
if (c=='(' || c=='{')
cout<<"Not Balanced";
break;
}
}
}
if (s.empty()) //check if stack is empty
{
return true;
}
else
{
return false;
}
}
int main()
{
std::ifstream t("prog1.cpp");
std::string str;
t.seekg(0, std::ios::end);
str.reserve(t.tellg());
t.seekg(0, std::ios::beg);
str.assign((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>());
if(areParenthesesBalanced(str))
{
cout<<"Balanced";
}
else
{
cout<<"Not Balanced";
}
return 0;
}
答案 0 :(得分:1)
您的问题:
要执行std::string::assign
,字符串必须resize
d才能包含该范围,而不是reserve
d。不过,std::string::append
或std::copy
与std::back_inserter
会有效。
其他:
在访问/弹出其顶部元素之前,您没有检查堆栈是否为空。
也许你想要return
一些东西,而不是cout<<"Not Balanced";
中的areParenthesesBalanced
。
没有错误:
您可以使循环仅包含switch
语句。
我认为您不需要任何a
,b
和c
变量。在与pop
进行所有比较后,您应std::stack::top
。
最后,请写下return s.empty();
而不是六行。
答案 1 :(得分:-1)
如果堆栈为空,则会抛出错误。请在使用前加上条件。还要对代码进行一些修改。这可能有用......
使用namespace std;
bool areParenthesesBalanced(const std::string& expr)
{
stack<char> s;
char a, b, c;
for (int i=0; i<expr.length(); i++)
{
if (expr[i]=='(' || expr[i]=='[' || expr[i]=='{')
{
s.push (expr[i]);
}
else
{
switch (expr[i])
{
case ')':
a = s.top();
s.pop();
if (a=='{' || a=='[')
cout<<"Not Balanced";
break;
case '}':
b = s.top();
s.pop();
if (b=='(' || b=='[')
cout<<"Not Balanced";
break;
case ']':
c = s.top();
s.pop();
if (c=='(' || c=='{')
cout<<"Not Balanced";
break;
}
}
}
if (s.empty()) //check if stack is empty
{
return true;
}
else
{
return false;
}
}
int main()
{
std::ifstream t("prog1.cpp");
std::string str;
t.seekg(0, std::ios::end);
str.resize(t.tellg());
t.seekg(0, std::ios::beg);
str.assign((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>());
if(areParenthesesBalanced(str))
{
cout<<"Balanced";
}
else
{
cout<<"Not Balanced";
}
return 0;
}