//运行时错误应该时你栈为空的时候你访问了top
//访问top之前一般都要判断一下栈是否为空
比如一种情况,一开始输入的就是右字符,立马就会访问top,此时栈是空的,就会出现运行时错误的情况,所以要首先进栈一个字符作为标志
stack<char> s;
s.push('@');//用于判断栈是否为空
最后进行所有括号匹配后要判断栈是否为空
if(s.top() !='@')
return false;
else return true;//漏了这一句,导致一直错误
具体代码如下:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
bool judge(string str)
{
stack<char> s;
s.push('@');//用于判断栈是否为空
for(int i=0;i<str.length();i++)
{
switch(str[i])
{
case '(':
s.push('(');
break;
case '[':
s.push('[');
break;
case '{':
s.push('{');
break;
case '<':
s.push('<');
break;
case ')':
if(s.top()=='('&&s.top() !='@')
{
s.pop();
}
else
{
return false;
}
break;
case ']':
if(s.top()=='['&&s.top() !='@')
{
s.pop();
}
else
{
return false;
}
break;
case '}':
if(s.top()=='{'&&s.top() !='@')
{
s.pop();
}
else
{
return false;
}
break;
case '>':
if(s.top()=='<'&&s.top() !='@')
{
s.pop();
}
else
{
return false;
}
break;
}
}
if(s.top() !='@')
return false;
else return true;//漏了这一句,导致一直错误
}
int main()
{
int m=0;
cin>>m;
string flag[m];
string str[m];
for(int i=0;i<m;i++)
{
cin>>str[i];
}
for(int i=0;i<m;i++)
{
if(!judge(str[i]))
{
flag[i]="No";
}
if(judge(str[i]))
{
flag[i]="Yes";
}
}
for(int i=0;i<m;i++)
{
cout<<flag[i]<<endl;
}
return 0;
}