递归实现带括号算术表达式求值:多连续括号计算错误求助
问题分析
你的代码核心问题在于括号层级的管理逻辑混乱,尤其是连续括号场景下,bracketcount没有被用来正确跟踪当前所处的括号层级,导致递归返回后无法判断是否需要继续处理后续字符,或是应该退出当前层级。此外,连续左括号的处理逻辑、递归返回后的字符读取逻辑也存在漏洞,导致多括号表达式计算错误。
修正后的代码
主函数(仅微调)
#include <stdio.h> int operator(int num1, int num2, char op); int elevator(int current_num, int bracket_level, char current_char); int main() { printf("enter an expression:\n"); char input_char; scanf(" %c", &input_char); if (input_char == '(') { scanf(" %c", &input_char); int result = elevator(0, 1, input_char); printf("result: %d\n", result); } else { printf("invalid expression: must start with '('\n"); } return 0; }
递归计算函数(核心修正)
int elevator(int current_num, int bracket_level, char current_char) { int num = current_num; char op; // 处理当前字符是数字的情况 if (current_char >= '0' && current_char <= '9') { num = current_char - '0'; scanf(" %c", ¤t_char); } // 遇到右括号,当前层级闭合,返回当前数值 if (current_char == ')') { bracket_level--; return num; } // 读取运算符 if (current_char == '+' || current_char == '-' || current_char == '*' || current_char == '/') { op = current_char; scanf(" %c", ¤t_char); } else { printf("invalid operator\n"); return 0; } int num2; // 处理下一个元素是左括号的情况:进入递归计算子表达式 if (current_char == '(') { bracket_level++; // 递归计算子括号内的结果 num2 = elevator(0, bracket_level, getchar()); // 读取子表达式结束后的右括号 scanf(" %c", ¤t_char); // 处理连续的右括号,回到当前层级 while (current_char == ')' && bracket_level > 1) { bracket_level--; scanf(" %c", ¤t_char); } } else if (current_char >= '0' && current_char <= '9') { num2 = current_char - '0'; scanf(" %c", ¤t_char); } else { printf("invalid character\n"); return 0; } // 按从左到右顺序计算当前结果 int sum = operator(num, num2, op); // 未到当前层级结尾,继续处理后续表达式;否则返回结果 if (current_char != ')') { return elevator(sum, bracket_level, current_char); } else { bracket_level--; return sum; } }
运算符函数(无修改)
int operator(int num1, int num2, char op) { switch (op) { case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': return num1 / num2; default: return 0; // 处理非法运算符 } }
关键修改点说明
括号层级精准跟踪:
- 每遇到左括号
(,bracket_level加1;每遇到右括号),bracket_level减1,严格对应括号嵌套层级。 - 从子递归返回后,通过循环处理连续右括号,确保层级回到当前递归的正确位置,不会遗漏后续表达式字符。
- 每遇到左括号
连续括号逻辑修复:
- 移除原代码中错误的连续左括号循环,改为遇到单个左括号就立即递归,层级自动累加,避免跳过括号导致层级计算错误。
递归返回后字符处理优化:
- 子表达式计算完成后,先读取对应的右括号,再检查是否有连续的右括号需要处理(对应外层括号闭合),保证后续字符读取逻辑正确。
移除冗余层级修改:
- 删除原代码中随意减少
bracketcount的逻辑,仅在遇到右括号或递归返回时根据实际情况调整层级,避免层级混乱。
- 删除原代码中随意减少
测试验证
针对你提到的多连续括号示例:
- 输入
(2*((3+4)-(6/2))),计算过程:(3+4)=7→7-(6/2)=4→2*4=8,最终输出8。 - 输入
((2*3+4)-(6/2)),计算过程:(2*3+4)=10→10-(6/2)=7,最终输出7。
内容的提问来源于stack exchange,提问作者דולב מנג'ם
相关产品推荐
相关产品推荐

