Description
Candela是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。这一天,刚刚起床的Candela画了一排括号序列,其中包含小括号()、中括号[]、大括号{}或什么都不画,总长度为N。这排随意绘制的括号序列显得杂乱无章,于是Candela定义了什么样的括号序列是美观的:
(1) 空的括号序列是美观的;
(2) 若括号序列A是美观的,则括号序列(A)、[A]、{A}也是美观的;
(3) 若括号序列A、B都是美观的,则括号序列AB也是美观的;
例如 [(){}]() 是美观的括号序列,而 )({)[}]( 则不是。
现在Candela想知道她画出的括号序列是不是美观的。你能帮帮她吗?
Input
一个正整数n,表示有n行序列。1<=n<=100;
接下来每行一个括号序列,长度不超过10000。
Output
一个序列一行,如果它是美观的,输出Yes,否则输出No。
Sample Input
1
{}[(){}]()
Sample Output
Yes
用一个栈解决.
#include <iostream>
#include <string>
#include <stack>
using namespace std;
stack<int> st;
string s;
bool check(string s) // 检查是否合法
{
int i;
while (!st.empty())
{
st.pop();
}
for (i = 0; i < s.size(); ++i)
{
switch (s[i])
{
case '(': // 如果是前括号
case '[':
case '{':
st.push(s[i]); // 入栈
break;
case ')': // 如果是后括号
if (st.empty()) // 匹配不了前括号,不合法
{
return false;
}
if (st.top() != '(') // 和前面的前括号不匹配,不合法
{
return false;
}
st.pop();
break;
case ']':
if (st.empty())
{
return false;
}
if (st.top() != '[')
{
return false;
}
st.pop();
break;
case '}':
if (st.empty())
{
return false;
}
if (st.top() != '{')
{
return false;
}
st.pop();
break;
}
}
return st.empty(); // 检查是否有前括号未被匹配
}
int main(void)
{
int t;
scanf("%d", &t);
while (t--)
{
cin >> s;
printf("%s\n", (check(s)) ? "Yes" : "No");
}
return 0;
}