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

K&R习题1-24:嵌套括号匹配校验程序Bug排查求助

排查嵌套括号匹配失败的核心问题

这类括号匹配问题必须依赖栈结构实现——左括号入栈,右括号则弹出栈顶并检查是否匹配。你的程序在简单场景正常但嵌套场景出错,90%是栈操作逻辑存在漏洞,重点排查以下几个点:

  • 错误使用单个变量替代栈:如果你的代码只用单个变量(比如last_open)存储最近的左括号,而非用数组模拟栈来维护后进先出的顺序,那完全无法处理嵌套场景。比如(())中,第一个)需要匹配内层的(,但单个变量会错误地拿它和外层(对比,触发不匹配提示。
    反例(错误逻辑):

    char last_open;
    if (c == '(') last_open = '(';
    else if (c == ')') {
        if (last_open != '(') printf("Mismatched character: ')'\n");
        // 嵌套时,第一个)对应的是内层(,但单个变量无法记录层级
    }
    
  • 栈顶指针维护错误:比如入栈时未先递增栈顶指针就赋值,或出栈后未正确递减指针。以(())为例:
    正确流程是:第一个(入栈→栈顶指针top=0;第二个(入栈→top=1;第一个)弹出栈顶(top=1的()→top=0;第二个)弹出栈顶(top=0的()→top=-1。如果你的代码在出栈时未递减top,第二次)会匹配错误的栈顶元素,触发报错。

  • 未正确处理栈空判断:遇到右括号时,首先要检查栈是否为空(比如非法输入)的情况),但如果栈顶指针维护错误,可能导致嵌套场景下明明栈内还有元素,却错误判定栈空,或者相反。

快速验证方法

可以用这段极简栈测试代码单独验证(())的处理逻辑:

#include <stdio.h>

int main() {
    char stack[100];
    int top = -1;
    char input[] = "(())";
    for (int i = 0; input[i] != '\0'; i++) {
        char c = input[i];
        if (c == '(') {
            stack[++top] = c;
        } else if (c == ')') {
            if (top == -1) {
                printf("Mismatched character: ')'\n");
                return 1;
            }
            char popped = stack[top--];
            if (popped != '(') {
                printf("Mismatched character: ')'\n");
                return 1;
            }
        }
    }
    if (top != -1) {
        printf("Unclosed brackets\n");
        return 1;
    }
    printf("All matched\n");
    return 0;
}

运行这段代码如果输出All matched,说明栈逻辑是正确的,你可以把自己代码中的栈实现部分和这段对比,定位差异点。

内容的提问来源于stack exchange,提问作者hansoko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:20:07