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

#include <stdio.h> int main() { char a[1001] = {0}; fgets(a, sizeof(a), stdin); int len = 0; while (a[len] != '\0') len++; if (len > 0 && a[len - 1] == '\n') { a[--len] = '\0'; } int flag = 0; for (int i = 0; a[i] != '\0'; i++) { if (a[i] == '(' || a[i] == '[' || a[i] == '{') { for (int j = len; j > i; j--) { if ((a[i] == '(' && a[j] == ')') || (a[i] == '[' && a[j] == ']') || (a[i] == '{' && a[j] == '}')) { flag = 1; break; } } } } if (flag == 1) printf("YES"); else printf("NO"); return 0; }
这段代码试图检查字符串中的括号是否匹配,但逻辑有误。它只检查每个左括号后面是否存在对应的右括号,而没有考虑括号的顺序和嵌套关系。

- 代码中内层循环从字符串末尾向前查找匹配的右括号,但这样会忽略括号的正确嵌套顺序。例如,对于字符串 "([)]",代码会错误地认为匹配成功。
- 正确的括号匹配需要后进先出的结构,通常使用栈来实现。你可以在遇到左括号时压栈,遇到右括号时检查栈顶是否匹配。