C语言递归检查等式括号平衡问题求助
C语言递归实现括号平衡检查(忽略非括号字符)
嘿,我来帮你搞定这个问题——用递归方式检查括号平衡,同时完美忽略等式里的其他字符和空格对吧?先说说核心思路:递归其实可以模拟栈的“入栈出栈”逻辑,我们只需要跟踪当前左括号比右括号多的数量,遇到非括号字符直接跳过就行,不用管它们。
完整实现代码
#include <stdio.h> #include <stdbool.h> #include <string.h> // 递归检查括号平衡的函数 bool checkBalance(char *str, int *index, int balance) { // 终止条件:遍历完所有字符,此时平衡数必须为0才是合法的 if (str[*index] == '\0') { return balance == 0; } // 处理当前字符 switch(str[*index]) { case '(': // 遇到左括号,平衡数+1,继续处理下一个字符 (*index)++; return checkBalance(str, index, balance + 1); case ')': // 遇到右括号,先判断是否有对应的左括号(平衡数不能为0) if (balance == 0) { return false; } // 平衡数-1,继续处理下一个字符 (*index)++; return checkBalance(str, index, balance - 1); default: // 非括号字符(包括空格),直接跳过,处理下一个 (*index)++; return checkBalance(str, index, balance); } } int main() { char input[100]; printf("请输入带括号的表达式:"); fgets(input, sizeof(input), stdin); // 去掉fgets读取的换行符 input[strcspn(input, "\n")] = '\0'; int index = 0; if (checkBalance(input, &index, 0)) { printf("括号是平衡的!\n"); } else { printf("括号不平衡!\n"); } return 0; }
关键部分解释
- 递归函数参数:
index用指针是因为递归过程中需要共享当前遍历的位置,不然每次递归都会从开头重新处理;balance记录当前左括号比右括号多的数量,用来判断是否匹配。 - 非括号字符处理:遇到除了
(和)之外的所有字符(包括空格、字母、数字、运算符),直接跳过,递归处理下一个字符就行,完全不影响平衡判断。 - 终止条件:当遍历到字符串末尾时,只有
balance等于0(所有左括号都有对应的右括号)才返回true,否则就是不平衡。
测试案例
- 输入
((a + b) * (c - d))→ 输出“括号是平衡的!” - 输入
(()→ 输出“括号不平衡!” - 输入
)a + b(→ 输出“括号不平衡!” - 输入
a + b * c→ 输出“括号是平衡的!”(没有括号也算平衡)
内容的提问来源于stack exchange,提问作者Arkarian
相关产品推荐
相关产品推荐

