当前位置:首页 > C > 正文

C语言括号匹配检测(从零开始掌握栈结构实现括号匹配算法)

在学习 C语言括号匹配 的过程中,你是否曾遇到过代码因括号不匹配而报错的情况?括号匹配是编译器、编辑器乃至各类解析器中非常基础且重要的功能。本文将带你从零开始,使用 C语言栈实现 一个完整的括号匹配检测程序,即使是编程小白也能轻松理解!

C语言括号匹配检测(从零开始掌握栈结构实现括号匹配算法) C语言括号匹配 C语言栈实现 括号匹配算法 C语言编程教程 第1张

什么是括号匹配?

括号匹配是指在一个字符串中,所有类型的括号(如 ()[]{})都必须正确成对出现,并且嵌套顺序合理。例如:

  • ✅ 正确:{[()]}
  • ❌ 错误:{[(])}
  • ❌ 错误:((]

为什么用“栈”来解决?

“栈”是一种后进先出(LIFO, Last In First Out)的数据结构,非常适合处理具有嵌套特性的结构,比如括号。每当遇到一个左括号(如 ([{),我们就把它压入栈;当遇到右括号时,就从栈顶弹出一个元素,检查是否与当前右括号匹配。

完整代码实现

下面是一个完整的 C 语言程序,用于检测输入字符串中的括号是否匹配:

#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 100// 定义栈结构typedef struct {    char data[MAX];    int top;} Stack;// 初始化栈void initStack(Stack* s) {    s->top = -1;}// 判断栈是否为空int isEmpty(Stack* s) {    return s->top == -1;}// 入栈void push(Stack* s, char c) {    if (s->top < MAX - 1) {        s->data[++(s->top)] = c;    }}// 出栈char pop(Stack* s) {    if (!isEmpty(s)) {        return s->data[(s->top)--];    }    return '\0'; // 空栈返回空字符}// 判断两个括号是否匹配int isMatchingPair(char open, char close) {    if (open == '(' && close == ')') return 1;    if (open == '[' && close == ']') return 1;    if (open == '{' && close == '}') return 1;    return 0;}// 括号匹配主函数int isBalanced(char* expr) {    Stack s;    initStack(&s);        for (int i = 0; expr[i] != '\0'; i++) {        char ch = expr[i];                // 如果是左括号,压入栈        if (ch == '(' || ch == '[' || ch == '{') {            push(&s, ch);        }        // 如果是右括号        else if (ch == ')' || ch == ']' || ch == '}') {            if (isEmpty(&s)) {                return 0; // 栈空但有右括号 → 不匹配            }            char top = pop(&s);            if (!isMatchingPair(top, ch)) {                return 0; // 括号类型不匹配            }        }        // 忽略其他字符(如字母、数字等)    }        // 最后栈必须为空才算完全匹配    return isEmpty(&s);}// 主函数测试int main() {    char expr[MAX];    printf("请输入一个包含括号的表达式:\n");    fgets(expr, sizeof(expr), stdin);        // 去掉换行符    expr[strcspn(expr, "\n")] = 0;        if (isBalanced(expr)) {        printf("✅ 括号匹配正确!\n");    } else {        printf("❌ 括号不匹配!\n");    }        return 0;}

代码说明

这段代码实现了以下核心功能:

  1. 栈的定义与操作:包括初始化、入栈、出栈、判空。
  2. 括号匹配判断:通过 isMatchingPair 函数判断左右括号是否成对。
  3. 主逻辑:遍历字符串,遇到左括号入栈,右括号则尝试匹配栈顶元素。
  4. 最终校验:遍历结束后,栈必须为空,否则说明有多余的左括号未闭合。

运行示例

假设你输入:{[a + b] * (c - d)}

程序会忽略字母和运算符,只关注括号,并输出:✅ 括号匹配正确!

总结

通过本教程,你已经掌握了如何用 C语言编程教程 中的基础知识实现一个实用的 括号匹配算法。这不仅加深了你对栈的理解,也为后续学习编译原理、表达式解析等高级主题打下坚实基础。

建议你动手敲一遍代码,修改测试用例,观察不同输入下的输出结果。编程能力就是在这样的小练习中不断提升的!