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

C语言栈实现括号匹配程序失效问题求助

修复括号匹配C程序的问题

你的代码存在多个关键问题,导致push/pop从未被调用且结果错误,以下是具体修复方案:

核心问题与修复点

  • 输入读取错误:
    原代码用scanf("%d", str);读取字符串,%d是整数格式符,会导致输入的表达式无法正确存入字符数组str,循环里的字符判断全部失效,栈始终为空。应改为scanf("%s", str);。

  • 括号匹配逻辑错误:
    直接比较str[i] == arr[top]无法匹配括号,因为(和)、{和}、[和]的ASCII值不相等。需要根据右括号对应匹配左括号,比如遇到)时检查栈顶是否为(,以此类推。

  • empty函数优化:
    原empty()函数每次调用都会打印栈空信息,干扰输出,且重复调用会多次打印。应移除打印逻辑,让函数仅返回栈是否为空的判断结果,打印操作放在需要的地方。

  • 未处理不匹配的右括号:
    原代码只处理右括号与栈顶匹配的情况,若不匹配(比如栈顶是(但当前是]),没有直接返回不平衡,会导致错误判断。需在这种情况下直接输出不平衡并退出。

  • 其他细节错误:

    • 输入提示拼写错误:Enter he expression改为Enter the expression
    • push函数的错误提示缺少换行符:printf("error:stack overflow n");改为printf("error: stack overflow\n");
    • main函数中异常退出应返回整数:return;改为return 1;

修复后的完整代码

#include <stdio.h>
#include <string.h>
#define MAX 100

int top = -1;
int arr[MAX];

void push(int x) {
    if (top == (MAX - 1)) {
        printf("error: stack overflow\n");
        return;
    }
    top++;
    arr[top] = x;
}

void pop() {
    if (top != -1) { // 防止栈空时执行pop
        top--;
    }
}

int empty() {
    return top == -1; // 仅返回判断结果,不打印
}

int main() {
    char str[30];
    int len, i;
    printf("Enter the expression\n");
    scanf("%s", str);
    len = strlen(str);

    for (i = 0; i < len; i++) {
        if (str[i] == '(' || str[i] == '{' || str[i] == '[') {
            push(str[i]);
        } else if (str[i] == ')' || str[i] == '}' || str[i] == ']') {
            if (empty()) {
                printf("Unbalanced\n");
                return 1;
            }
            // 判断当前右括号是否与栈顶左括号匹配
            int match = 0;
            if ((str[i] == ')' && arr[top] == '(') ||
                (str[i] == '}' && arr[top] == '{') ||
                (str[i] == ']' && arr[top] == '[')) {
                match = 1;
            }
            if (match) {
                pop();
            } else {
                printf("Unbalanced\n");
                return 1;
            }
        }
    }

    if (empty()) {
        printf("Balanced\n");
    } else {
        printf("Unbalanced\n");
    }

    return 0;
}

修复后逻辑说明

  1. 正确读取输入的表达式字符串,确保循环能遍历每个字符。
  2. 遇到左括号时压入栈中。
  3. 遇到右括号时:
    • 先检查栈是否为空,为空则说明无匹配的左括号,直接输出不平衡并退出。
    • 检查当前右括号与栈顶左括号是否匹配,匹配则弹出栈顶;不匹配则直接输出不平衡并退出。
  4. 循环结束后,若栈为空说明所有括号都匹配,输出平衡;否则说明有未匹配的左括号,输出不平衡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:50:25