本题目要求读入n个字符串,每个字符串是一个括号序列,如“{[()]}”,然后判断每个括号序列是否匹配。
输入格式:
第一个输入为整数n,表示n个序列,然后依次输入n个括号序列。
输出格式:
对于每一括号序列,如果序列中的括号是匹配的,则输出Yes;否则,输出“No”。
输入样例:
在这里给出一组输入。例如:
2
{([])}
([]{}()(())
输出样例:
在这里给出相应的输出。例如:
Yes
No
代码如下:
#include <stdio.h>
#define N 20
int match(char *a);
int main(){
char s[N];
int n,result;
scanf("%d",&n);
while(n--){
scanf("%s",s);
result= match(s);
if(result){
printf("Yes\n");
} else{
printf("No\n");
}
}
return 0;
}
typedef struct{
char data[N];
int top;
}Sq;
//初始化栈
void Init(Sq *stack){
stack->top=-1;
}
//判断栈内是否为空
int Empty(Sq *stack){
if(stack->top==-1){
return 1;
}else{
return 0;
}
}
//入栈
void Push(Sq *stack,char val){
stack->top++;
stack->data[stack->top]=val;
}
//出栈
void Pop(Sq *stack){
stack->top--;
}
//返回栈顶元素
char query(Sq *stack){
return stack->data[stack->top];
}
int match(char *a){
Sq stack;
Init(&stack);
while(*a){
if(*a=='['||*a==']'||*a=='{'||*a=='}'||*a=='('||*a==')'){
//先入栈
if(Empty(&stack)==1){
Push(&stack,*a);
//第一种就是测试案例互相对称([]{}())这种,下面的else if语句就是判断字符串a 入栈一半之后,栈顶元素和 字符串a 后一半元素比较,
//如果前一半入栈的元素和后一半未入栈元素都一一相等,就Pop,如果都相等则栈内为空
//第二种就是{()[](){}[][} 依次进行判断,最后会栈内会有一个[,说明不匹配
}else if(query(&stack)=='['&&*a==']'){
Pop(&stack);
}else if(query(&stack)=='('&&*a==')'){
Pop(&stack);
}
else if(query(&stack)=='{'&&*a=='}'){
Pop(&stack);
}else{
Push(&stack,*a);
}
}
a++;
}
if(stack.top==-1){
return 1;
}else{
return 0;
}
}