题意:输出Yes的情况有,空串,字符串里的括号完全匹配,其余输出No.
思路:字符串从后往前遍历,遇到‘)’或者‘]’,就入栈,遇到‘(’或‘[’就和出栈首字符进行匹配,如果满足,继续进行匹配,如果不满足,停止匹配,输出No,最后判断空串的条件是字符串长度为0,因为是%c读入,所以如果是空串的话,我们只需要把换行符转化为终止符存入字符数组。
总结:emmm,这道题其实自己是把它归为水题来写的,但是呢,由于自己的粗心,所以导致错了5遍才成功提交,主要原因如下,1:用了号称万能头文件的头文件#include<bits/stdc++.h>,using namespace std;然后就re了好几遍,我一直不知道是这个原因,最后才注意到;2:审题不认真,题目说了,空串也输出Yes,我忽略了这个问题,so,再见
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<string.h>
#include<stack>
using namespace std;
#define N 200
char str[N];
int main()
{
int flag,t,l,i;
char ch;
scanf("%d",&t);
getchar();
while(t--)
{
i = 0;
while(1)
{
scanf("%c",&str[i]);
if(str[i] == '\n')
break;
i++;
}
str[i] = '\0';
l = strlen(str);
stack<char>s;
flag = 0;
for( i = l-1; i >= 0; i--)
{
if(str[i] == ']'||str[i] == ')')
{
s.push(str[i]);
}
else if(str[i] == '(')
{
if(!s.empty()&&s.top() == ')')//注意先后顺序 否则停止运行
{
s.pop();
flag = 1;
}
else
break;
}
else if(str[i] == '[')
{
if(!s.empty()&&s.top() == ']')//判断是否为空才能进行出栈操作
{
s.pop();
flag = 1;
}
else
break;
}
}
if(l==0)//判断是否为空串
{
printf("Yes\n");
continue;
}
if(i>=0||!flag||!s.empty())
printf("No\n");
else
printf("Yes\n");
}
return 0;
}