给定一串由()和[]组成的字符串。如果我们规定以下的字符串是合法的字符串:
(1) 空串是合法的字符串
(2) 如果A、B都是合法的,那么AB也是合法的字符串。
(3) 如果A是合法的,那么(A)和[A]都是合法的字符串。
也就是说,所有左右括号必须配对,且不能“切开括号”(如“[(])”或“([)]”)。
输入
输入先是一个正整数n,代表有n个字符串。
接下来是n行字符串,每个字符串一行,注意,
可能有空串
。
输出
对于每组数据,若是合法的字符串,则在单独的一行输出Yes,不然则出No。
样例输入
6 ([]) (([()]))) ([()[]()])() (([(]))) ()[][()]
样例输出
Yes No Yes No Yes Yes
注意
输入中可能有空串。
题解:要用栈,后进先出,依次判断几种情况。
#include <iostream>
#include <stack>
#include<string>
#include <string.h>
using namespace std;
char a[100000000]={};
int main() {
int T;
cin>>T;
getchar();
while (T--) {
stack<char> st;
cin.getline(a, 100000);
long len= strlen (a);
for (int i=0; i<len; i++) {
if (a[i]==' ') {
continue;
}
else if (a[i]=='('||a[i]=='['){
st.push(a[i]);
}
else if (a[i]==')') {
if (st.size()&&st.top()=='(') {
st.pop();
}else{
st.push(a[i]);
}
}
else if (a[i]==']') {
if (st.size()&&st.top()=='[') {
st.pop();
}else{
st.push(a[i]);
}
}
}
if (st.size()) {
cout<<"No"<<endl;
}else
cout<<"Yes"<<endl;
}
return 0;
}