You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

括号匹配程序测试用例失败求助: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

失败用例

  • ([])
  • (

问题根源分析

代码存在两个核心错误:

  1. 未检查最终栈状态:isMatch函数处理完所有字符后,未判断栈是否为空。比如测试用例(,处理后栈中残留左括号,但函数仍返回TRUE,导致错误输出Yes。
  2. 栈对象管理混乱:主函数创建的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:04:58