Онлайн компилятор C

#include <stdio.h> int main() { char a[1000]; long long int p = 0; scanf("%[^\n]", a); while(a[p] != '\0' ) { p++; } int q1=0,q2=0,q3=0; int p1=0,p2=0,p3=0; for(int i = 0; i<p;i++) { if(a[i]=='(' && q1 == 0) { q1 = 1; p1++; } else if (a[i]=='(' && q1 == 1) { printf("NO"); return 0; } if(a[i]==')' && q1 == 1) { q1 = 0; p1++; } else if (a[i]==')' && q1 == 0) { printf("NO"); return 0; } // if(a[i]=='[' && q2 == 0) { q2 = 1; p2++; } else if (a[i]=='[' && q2 == 1) { printf("NO"); return 0; } if(a[i]==']' && q2 == 1) { q2 = 0; p2++; } else if (a[i]==']' && q2 == 0) { printf("NO"); return 0; } // if(a[i]=='{' && q3 == 0) { q3 = 1; p3++; } else if (a[i]=='{' && q3 == 1) { printf("NO"); return 0; } if(a[i]=='}' && q3 == 1) { q3 = 0; p3++; } else if (a[i]=='}' && q3 == 0) { printf("NO"); return 0; } } if(p1>1&&p2>1&&p3>1&& p1%2 == 0&& p2%2 ==0 &&p3%2==0) { printf("YES"); } else { printf("NO"); } return 0; }
这段代码试图检查输入的括号序列是否匹配,但它的逻辑有根本性的问题。它用三个独立的标志变量分别跟踪圆括号、方括号和花括号,但这种方式无法处理括号的嵌套和交叉顺序。

例如,对于输入 `([)]`,代码会错误地输出 `YES`,因为每个类型的括号各自计数,但实际顺序是错的。正确的括号匹配需要用一个栈结构来保证后打开的括号先关闭。

- 你的代码只检查了每种括号是否成对出现,但没有检查它们之间的相对顺序。比如 `( [ ) ]` 这种交叉情况会被错误地接受。
- 你用了三个独立的标志 `q1`、`q2`、`q3` 来记录每种括号是否“打开”,但真正的括号匹配需要知道最近打开的是哪种括号。考虑用一个栈(数组模拟)来存储遇到的左括号,遇到右括号时检查栈顶是否匹配。