解题思路:
注意事项:
参考代码:
#include <stdio.h>
#include <string.h>
typedef struct s{
int top;
char data[1000];
}STACK;
void clear(STACK *stack){ //初始化栈
stack->top=-1;
}
void pop(STACK *stack){ //出栈
stack->top--;
}
void push(STACK *stack,char c){ //入栈
stack->top++;
stack->data[stack->top]=c;
}
int compare(char c){ //将四种括号赋于优先级
if (c=='<'||c=='>'){
return 1;
}else if (c=='('||c==')'){
return 2;
}else if (c=='['||c==']'){
return 3;
}else{
return 4;
}
}
int main (){
int n,f=0;
STACK *stack;
stack=(STACK *)malloc(sizeof(STACK)); //指针创建空间
scanf ("%d",&n);
getchar ();
for (int j=0;j<n;j++){
clear(stack);
f=0; //记录是否输出的标志
char a[1000];
scanf ("%s",a);
for (int i=0;a[i]!='\0';i++){
if (a[i]=='<'||a[i]=='('||a[i]=='['||a[i]=='{'){ //左括号处理
if (stack->top==-1||compare(stack->data[stack->top])>=compare(a[i])){ //如果栈为空左括号直接入栈或者该括号优先级比栈顶括号小于等于也入栈
push(stack,a[i]);
}else if (compare(stack->data[stack->top])<compare(a[i])){ //如果该括号优先级比栈顶括号优先级高的话,匹配就错误了
printf ("NO\n");
f=1; //标志为1,代表输出过答案,后面就不输出
break;
}
}else if (a[i]=='>'||a[i]==')'||a[i]==']'||a[i]=='}'){ //右括号处理
if (stack->top==-1){ //如果在输入右括号时,栈为空就永远匹配不上,直接输出NO
printf ("NO\n");
f=1; //标志为1,代表输出过答案,后面就不输出
break;
}
if (compare(stack->data[stack->top])==compare(a[i])){ //该括号优先级等于栈顶括号优先级的话,两括号匹配成功,将栈顶括号出栈即可
pop(stack);
}else{ //该括号优先级不等于栈顶括号优先级的话,两括号匹配失败,直接输出NO
printf ("NO\n");
f=1; //标志为1,代表输出过答案,后面就不输出
break;
}
}
}
if (f==0&&stack->top==-1){ //如果最后栈为空了,代表全部匹配上了,并且f==0,无输出,则全部成功,输出YES
printf ("YES\n");
}else if (f==0&&stack->top!=-1){ //如果最后栈不为空了,代表没有全部匹配上,并且f==0,无输出,则匹配失败,输出NO
printf ("NO\n");
}
}
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复