题目描述
字符串中只含有括号 (),[],<>,{}
,判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{}
。例如,输入: [()]
输出:YES
,而输入([])
,([)]
都应该输出NO
。
输入:第一行为一个整数 n n n,表示以下有多少个由括好组成的字符串。接下来的 n n n行,每行都是一个由括号组成的长度不超过255的字符串。
输出:在输出文件中有
n
n
n行,每行都是YES
或NO
。
程序:
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
stack<int> S;
int main(){
char a[]={'{','[','(','<','}',']',')','>'};//{→0 [→1 (→2 <→3 }→4 ]→5 )→6 >→7
char str[300];
int b[300];
int n;
cin>>n;//输入测试数据组数
while(n--)
{
while(!S.empty()){ //保证栈空
S.pop();
}
bool flag=true; //用于判断嵌套是否合法的标记
cin>>str;
int len=strlen(str);
for(int i=0;i<len;i++)
for(int j=0;j<8;j++)
if(str[i]==a[j])
{
b[i]=j; //建立映射
break; //跳出内循环
}
for(int i=0;i<len;i++)//判断是否匹配
{
if(b[i]<=3)//b[i]元素入栈
{
if(!S.empty()&&b[i]<S.top())//元素无法入栈,说明该组数据非法
{
flag=false;
break;
}
else//b[i]元素可以入栈
S.push(b[i]);
}
else if(b[i]>=4)//判断是否配对
{
if(S.empty()||(S.top()+4)!=b[i])//无法配对
{
flag=false;
break;
}
else//可以配对
S.pop();
}
}
if(!S.empty())
cout<<"NO"<<endl;//栈内有元素,匹配不成功
else if(flag==1)
cout<<"YES"<<endl;//栈内无元素,匹配成功
else
cout<<"NO"<<endl;//栈内无元素,匹配不成功
}
return 0;
}
输入:
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
输出:
YES
YES
YES
YES
NO