题意
给定一串由()和[]组成的字符串。如果我们规定以下的字符串是合法的字符串:
(1) 空串是合法的字符串
(2) 如果A、B都是合法的,那么AB也是合法的字符串。
(3) 如果A是合法的,那么(A)和[A]都是合法的字符串。
也就是说,所有左右括号必须配对,且不能“切开括号”(如“[(])”或“([)]”)是不匹配的。
思路
直接拿栈模拟就OK,左括号入栈,右括号判断与栈顶是否匹配,匹配完最后一个字符后,栈为空证明匹配。
注意中间栈为空的判断,和读入的时候空串处理。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 130;
char s[MAXN];
int main()
{
int T; scanf("%d%*c", &T);
while (T--)
{
gets(s);
bool flag = true;
int len = strlen(s);
stack<char> S;
for (int i = 0; i < len; i++)
{
if (s[i] == '[' || s[i] == '(') S.push(s[i]);
else
{
if (S.empty()) { flag = false; break; }
char u = S.top(); S.pop();
if (u == '(' && s[i] != ')' || u == '[' && s[i] != ']') { flag = false; break; }
}
}
if (flag && S.empty()) printf("Yes\n");
else printf("No\n");
}
return 0;
}
/*
4
([])
(([()])))
([()[]()])()
*/