本题目要求读入n个字符串,每个字符串是一个括号序列,如“{[()]}”,然后判断每个括号序列是否匹配。
第一个输入为整数n,表示n个序列,然后依次输入n个括号序列。
对于每一括号序列,如果序列中的括号是匹配的,则输出Yes;否则,输出“No”。
在这里给出一组输入。例如:
2
{([])}
([]{}()(())
在这里给出相应的输出。例如:
Yes
No
#include<stdio.h>
#include<string.h>
//主要思路:遇到左括号进栈,遇到右括号出栈。对比失败或最后栈不为空为No.
struct stack{
int top;
char arr[20];
};
int main(){
int n=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
struct stack p;
p.top=-1;//初始化
int flag=0;//用于标记是否匹配成功
char temp[20];
scanf("%s",temp);
int len= strlen(temp);
for(int j=0;j<len;j++){
if(temp[j]=='{'||temp[j]=='['||temp[j]=='('||temp[j]==')'||temp[j]==']'||temp[j]=='}'){//排除一些乱七八糟的东西
if(temp[j]=='{'||temp[j]=='['||temp[j]=='('){
p.arr[++p.top]=temp[j];//进栈
}else{
if(temp[j]==')'&&p.arr[p.top]=='('||temp[j]==']'&&p.arr[p.top]=='['||temp[j]=='}'&&p.arr[p.top]=='{'){
//注意&&的优先级比||高,所以可以这么写。
p.top--;//出栈
}else{
flag=1;//匹配失败直接跳出
break;
}
}
}
}
// 最后输出
if(flag==0&&p.top==-1){
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}
?