在学习 C语言括号匹配 的过程中,你是否曾遇到过代码因括号不匹配而报错的情况?括号匹配是编译器、编辑器乃至各类解析器中非常基础且重要的功能。本文将带你从零开始,使用 C语言栈实现 一个完整的括号匹配检测程序,即使是编程小白也能轻松理解!
括号匹配是指在一个字符串中,所有类型的括号(如 ()、[]、{})都必须正确成对出现,并且嵌套顺序合理。例如:
{[()]}{[(])}((]“栈”是一种后进先出(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;} 这段代码实现了以下核心功能:
isMatchingPair 函数判断左右括号是否成对。假设你输入:{[a + b] * (c - d)}
程序会忽略字母和运算符,只关注括号,并输出:✅ 括号匹配正确!
通过本教程,你已经掌握了如何用 C语言编程教程 中的基础知识实现一个实用的 括号匹配算法。这不仅加深了你对栈的理解,也为后续学习编译原理、表达式解析等高级主题打下坚实基础。
建议你动手敲一遍代码,修改测试用例,观察不同输入下的输出结果。编程能力就是在这样的小练习中不断提升的!
本文由主机测评网于2025-12-14发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025127395.html