算法思想:
将输入的字符串遍历。
遇到左括号就压栈;遇到右括号,若栈不为空,就将栈顶的左括号取出,匹配返回一个bool值。
若直至遍历结束都没有发生错误且栈为空,则匹配成功。
算法设计:
bool check(string s)
{ stack<char> p
bool flag
for i to s.length() :
if ( left (s[i]) ) p.push(s[i])
if ( right(s[i]) ) :
if( !s.empty() && match(s.top(),s[i]) ):
s.pop()
else flag=false;
}
测试例子:
(()){}
(qw){[]}
#include<iostream>
#include<stack>
#include<cstdlib>
#include<cstring>
using namespace std;
bool left(char s)
{
return s=='('||s=='{'||s=='[';
}
bool right(char s)
{
return s==')'||s=='}'||s==']';
}
bool check(char a,char b)
{
return (a=='('&&b==')') || (a=='{'&&b=='}')||(a=='['&&b==']');
}
bool match(string s)
{
stack<char> p;
bool flag=true;
for(int i=0;i<s.length();i++)
{
if(left(s[i]))
{
p.push(s[i]);
}
if(right(s[i]))
{
if(!p.empty()&&check(p.top(),s[i]))
{
p.pop();
}
else flag=false;
}
}
if(!p.empty())flag=false;
return flag;
}
int main()
{
int n;
cin>>n;
cin.ignore(1, '\n');
for(int i=0;i<n;i++)
{
string str;
getline(cin,str);//读入string
if(match(str))
{
cout<<"Yes"<<endl;
}
else cout<<"No"<<endl;
}
}