P a r t Part Part 1 1 1 读题
题目描述
为了让 t y w z tywz tywz的同学们更富有智慧,贤者 w g y wgy wgy决定开设计算机基础、C语言程序设计、数据结构等课程。下头男 w h y why why听说课上可以玩电脑,于是兴冲冲地把有实力的 a y b ayb ayb拉上,报名参加了C语言基础课程。
下头男 w h y why why当然什么都听不懂(毕竟他的智商只有 − 1145141919810 -1145141919810 −1145141919810),所以每次上课他都全程跟有实力的 a y b ayb ayb玩斗地主,下课后请其他同学帮他写作业。 9 9 9个月后他把 t y w z tywz tywz所有的同学都委托了一遍,现在他找不到别人,只能再次找你了。
这次的作业是这样的:给你一个括号序列,其中有圆括号 ( ) () ()、方括号 [ ] [] []、花括号 {} 和尖括号 < > <> <>,请问该序列是否合法。
合法的括号序列可以按如下方式递归定义:
1. 1. 1.空序列是合法的;
2. 2. 2.若 A A A和 B B B是合法的括号序列,则 A B AB AB(将 B B B连接到 A A A的后方)也是合法的括号序列;
3. 3. 3.若 A A A是合法的括号序列,则在两端添加一对括号, ( A ) (A) (A)、 [ A ] [A] [A]、 A {A} A、 < A > <A>都是合法的括号序列。
输入格式
第一行是一个正整数 T T T,表示数据组数;
之后 T T T行,每行包含一个字符串,表示待判断的括号序列。保证字符串非空且只会包含 ( ) [ ] < > ()[]{}<> ()[]<>这 8 8 8种字符。
输出格式
对于每组数据,若该序列是合法的则输出 Y e s Yes Yes,否则输出 N o No No。
输入样例
3
(([]))
([(]))
{<><>}<{{(}}>)
输出样例
Yes
No
No
数据范围与提示
T ≤ 1 0 5 T≤10^{5} T≤105,所有测试数据的序列长度之和 ≤ 1 0 6 ≤10^{6} ≤106。
本题共 10 10 10组测试文件,部分满足如下的附加限制条件:
测试点 1 − 3 1-3 1−3:序列中只包含圆括号
测试点 1 − 6 1-6 1−6: T ≤ 30 T≤30 T≤30
测试点 4 4 4:每个序列长度 ≤ 100 ≤100 ≤100
测试点 1 、 5 、 6 1、5、6 1、5、6:每个序列长度 ≤ 1000 ≤1000 ≤1000
P a r t Part Part 2 2 2 思路
本题较为简易,不需要判断大小,只需要判断括号是否正确,满足就输出 Y e s Yes Yes,不满足就输出 N o No No
P a r t Part Part 3 3 3 代码
#include
using namespace std;
int top,t,d[5];
char s[10000005],a[10000005];
bool f;
int main(){
scanf("%d",&t);
for(int i=1;i<=t;i++){
cin>>a;
f=true;
top=0;
int len=strlen(a);
d[1]=0,d[2]=0,d[3]=0,d[4]=0;
for(int j=0;j<len;j++){
if(f==false)break;
if(a[j]=='<'){
d[1]++;
s[++top]=a[j];
}
else if(a[j]=='('){
d[2]++;
s[++top]=a[j];
}
else if(a[j]=='['){
d[3]++;
s[++top]=a[j];
}
else if(a[j]=='{'){
d[4]++;
s[++top]=a[j];
}
else if(a[j]=='>'){
if(s[top]=='<'&&d[1] != 0){
top--;
d[1]--;
}
else{
printf("No\n");
f=false;
break;
}
}
else if(a[j]==')'){
if(s[top]=='('&&d[2]!=0){
top--;
d[2]--;
}
else{
printf("No\n");
f=false;
break;
}
}
else if(a[j]==']'){
if(s[top]=='['&&d[3]!=0){
top--;
d[3]--;
}
else{
printf("No\n");
f=false;
break;
}
}
else if(a[j]=='}'){
if(s[top]=='{'&&d[4]!=0){
top--;
d[4]--;
}
else{
printf("No\n");
f=false;
break;
}
}
}
if(top==0&&f==true)printf("Yes\n");
if(top!=0&&f==true)printf("No\n");
}
return 0;
}
听完后,是不是觉得很简单呢?赶快自己去试一下吧!!!