括号匹配程序测试用例失败求助:2个测试点未通过
括号匹配程序问题排查
问题概述
基于栈实现圆括号、方括号、大括号匹配程序,当前有2个测试用例未通过,请求排查问题。
测试用例详情
输入测试用例数量:12
测试字符串:
([])(([()])))([()[]()])()(([()])([])(([()])))([()[]()])()((])(][
预期输出
Yes Yes No Yes No Yes No Yes No No No No
实际输出
Yes Yes No Yes Yes // 应为No Yes No Yes Yes // 应为No No No No
失败用例
([])(
问题根源分析
代码存在两个核心错误:
- 未检查最终栈状态:
isMatch函数处理完所有字符后,未判断栈是否为空。比如测试用例(,处理后栈中残留左括号,但函数仍返回TRUE,导致错误输出Yes。 - 栈对象管理混乱:主函数创建的
hStack与isMatch内部创建的栈是独立对象,主函数中清理hStack对isMatch的栈无作用,且isMatch未销毁自身创建的栈,会造成内存泄漏。
代码修复方案
1. 修正isMatch函数
添加栈空检查、销毁内部栈、提前终止无效循环:
Boolean isMatch(void) { STACK hStack; int noc; char c; Boolean m = TRUE; hStack = StackInitDefault(); if (hStack == NULL) { printf("Failed to allocate space for stack object.\n"); exit(2); } noc = scanf("%c", &c); // 匹配失败时提前终止循环,提升效率 while (noc == 1 && c != '\n' && m) { if (StackIsEmpty(hStack)) { if (c == '(' || c == '[' || c == '{') { StackPush(hStack, c); } else if (c == ')' || c == ']' || c == '}') { m = FALSE; } } else { if (c == '(' || c == '[' || c == '{') { StackPush(hStack, c); } else if (c == ')' || c == ']' || c == '}') { if ((c == ')' && StackTop(hStack, NULL) == '(') || (c == ']' && StackTop(hStack, NULL) == '[') || (c == '}' && StackTop(hStack, NULL) == '{')) { StackPop(hStack); } else { m = FALSE; } } } noc = scanf("%c", &c); } // 处理完字符后,栈不为空则匹配失败 if (m && !StackIsEmpty(hStack)) { m = FALSE; } // 销毁内部创建的栈,避免内存泄漏 StackDestroy(&hStack); // 清理当前行剩余字符,避免干扰下一次输入 if (noc == 1 && c != '\n') { ClearKeyboardBuffer(); } return m; }
2. 简化主函数
移除主函数中多余的栈操作(isMatch内部已独立管理栈):
int main(int argc, const char * argv[]) { int n; scanf("%d", &n); ClearKeyboardBuffer(); while (n--) { printf(isMatch() ? "Yes\n" : "No\n"); } return 0; }
3. 优化缓冲区清理函数(可选)
原函数可能在缓冲区为空时阻塞,替换为更健壮的实现:
void ClearKeyboardBuffer(void) { int c; while ((c = getchar()) != '\n' && c != EOF); }
内容的提问来源于stack exchange,提问作者bluediager
相关产品推荐
相关产品推荐

