解题思路:
注意事项:
参考代码:
#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语言代码)浏览:1168 |
C二级辅导-同因查找 (C++代码)(42的倍数,,所以直接递加42输出)浏览:1161 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:1152 |
校门外的树 (C语言代码)浏览:1166 |
C二级辅导-计负均正 (C语言代码)浏览:652 |
川哥的吩咐 (C++代码)浏览:1076 |
C语言程序设计教程(第三版)课后习题9.8 (Java代码)浏览:1674 |
三角形 (C++代码)递归(存在大量重复计算,容易出现时间超限)浏览:836 |
【求[X,Y]内被除3余1并且被除5余3的整数的和】 (C语言代码)浏览:703 |
DNA (C语言描述,蓝桥杯)浏览:1653 |