题目描述
字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包 含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]),([)]都应该 输出 NO。
输入
第一行为一个整数 n,表示以下有多少个由括好组成的字符串。接下来的 n 行, 每行都是一个由括号组成的长度不超过 255 的字符串。
输出
有 n 行(n≤20),每行都是 YES 或 NO。
样例输入 Copy
5 {}{}<><>()()[][] {{}}{{}}<<>><<>>(())(())[[]][[]] {{}}{{}}<<>><<>>(())(())[[]][[]] {<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]] ><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
样例输出 Copy
YES YES YES YES NO
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i;
cin>>n;
while(n--)
{
bool f=0;
stack<int> x;//建立一个int型的栈
string a;
int s[300];//题目中说括号的最大长度不超过255,就定义了长度为300
cin>>a;
for(i=0;i<a.size();i++)
{
if(a[i]=='<')//把每个括号都转化成对应的数字
s[i]=1;
else if(a[i]=='>')
s[i]=2;
else if(a[i]=='(')
s[i]=3;
else if(a[i]==')')
s[i]=4;
else if(a[i]=='[')
s[i]=5;
else if(a[i]==']')
s[i]=6;
else if(a[i]=='{')
s[i]=7;
else if(a[i]=='}')
s[i]=8;
}
for(i=0;i<a.size();i++)
{
if(x.empty())//如果这个栈是空的,就直接把当前数据压入栈顶
x.push(s[i]);
else if(s[i]%2!=0)//如果当前数据数左边的括号
{
if(s[i]<=x.top())//如果这个括号的优先级小于或者等于栈顶的数据
x.push(s[i]);//就将当前的数据压入栈顶
else
{
f=1; //否则就是不符合题目意思,就直接让标志器置1,跳出循环
break;
}
}
else//如果说当前数据是右边的括号
if(s[i]-1==x.top())//那就判断栈顶的括号是不是当前数据的左边括号
x.pop();//如果是就删除栈顶数据
}
if(x.empty()&&f==0)//如果这些括号能够根据题意一一对应
cout<<"YES\n";//就说明最后这个栈的内容应该是空的,并且标志器的值没有发生变化
else
cout<<"NO\n";
}
}