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

基于C语言栈实现表达式括号匹配检查的问题排查

栈的应用:括号匹配问题修复

问题根源

你的代码核心问题出在pop函数的比较逻辑上:你直接拿右括号(比如))和栈顶的左括号(比如()做相等判断,但这两个字符本身并不相同,导致x == stack[top-1]这个条件永远无法成立,自然无法执行top--来弹出栈顶元素。

修复方案

需要修改pop函数的判断逻辑,让右括号对应匹配的左括号,同时完善不匹配场景的处理,比如栈空时遇到右括号、括号类型不匹配的情况,直接标记为不平衡状态。

修复后的完整代码:

#include <stdio.h>
#include <stdbool.h>

char stack[30];
int top = 0;

bool is_balanced = true; // 标记表达式是否平衡

void push(char x){
    if (top == 30)
        printf("Full\n");
    else{
        stack[top] = x;
        top++;
    }
}

void pop(char x){
    if (top == 0){
        // 栈为空时遇到右括号,直接判定不平衡
        is_balanced = false;
        return;
    }
    char top_char = stack[top-1];
    // 判断当前右括号是否匹配栈顶的左括号
    if ((x == ')' && top_char == '(') || 
        (x == '}' && top_char == '{') || 
        (x == ']' && top_char == '[')){
        top--;
    } else {
        // 括号类型不匹配,标记不平衡
        is_balanced = false;
    }
}

int main()
{
    char temp[30];
    scanf("%s", temp);

    for (int i = 0; temp[i] != '\0'; i++)
    {
        if (!is_balanced) break; // 已确定不平衡,提前终止循环
        if (temp[i] == '(' || temp[i] == '{' || temp[i] == '[')
            push(temp[i]);
        else if (temp[i] == ')' || temp[i] == '}' || temp[i] == ']')
            pop(temp[i]);
    }

    // 最终判定:栈为空且全程无匹配错误才是平衡的
    if (top != 0 || !is_balanced)
        printf("Unbalanced");
    else
        printf("Balanced");
    return 0;
}

额外优化说明

  • 替换原代码中未实际生效的spec变量为is_balanced,更直观地追踪匹配状态。
  • 新增提前终止逻辑:一旦发现不平衡,直接跳出循环,避免无效遍历。
  • 最终判断同时检查栈是否为空和全程是否无匹配错误,避免([)]这类栈最终为空但实际不匹配的误判。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:40:32