题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=614
题目大意:括号的匹配。
分析:利用栈模拟一边,如果是左括号就加入栈,如果是右括号,就检验与栈顶元素是否匹配。需要注意的是:当遇到右括号时要判断栈是否为空,如果栈为空,就直接跳出;还有当遇到只有\0的情况,需要输出Yes,所以不能用scanf,要用gets输入。
ac代码
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
char str[130];
int main()
{
int T;
scanf("%d", &T);
getchar();
for(int t = 1; t <= T; t++)
{
stack<char> s;
int flag = 1;
gets(str);
if(str[0] == '\0')
{
printf("Yes\n");
continue;
}
int len = strlen(str);
if(len % 2)flag = 0;
else
{
for(int i = 0; i < len; i++)
{
if(str[i] == '(' || str[i] == '[')s.push(str[i]);
if(str[i] == ')')
{
if(s.empty())
{
flag = 0;
break;
}
if(s.top() == '(')s.pop();
else
{
flag = 0;
break;
}
}
if(str[i] == ']')
{
if(s.empty())
{
flag = 0;
break;
}
if(s.top() == '[')s.pop();
else
{
flag = 0;
break;
}
}
}
if(!s.empty())flag = 0;
}
if(flag)printf("Yes\n");
else printf("No\n");
}
return 0;
}