C语言基于链表实现中缀转后缀表达式代码运行异常求助
中缀转后缀链表实现代码问题修复
核心问题点
- 缺少栈空判断:处理第一个运算符时,栈顶指针
top为NULL,代码直接访问top->data会触发空指针非法访问,直接导致程序崩溃。 - 循环未做空栈终止判断:优先级比较的
while循环未判断栈是否为空,若弹栈操作把栈清空后,下一轮循环依然会访问top->data触发空指针错误。 - (可选优化)幂运算符
^为右结合运算符,当前<=的判断逻辑会把连续幂运算转成左结合,不符合数学运算规则,可根据需求调整为<。
修复代码
需要修改convert函数中运算符优先级判断的逻辑段:
// 原错误逻辑 // if (precedence(ch) > precedence(top->data)) // { // push(ch); // } // else // { // while (precedence(ch) <= precedence(top->data)) // { // postfix = insert(postfix, pop()); // } // push(ch); // } // 修复后逻辑 if (top == NULL || precedence(ch) > precedence(top->data)) { push(ch); } else { // 增加栈非空判断,避免空指针访问 while (top != NULL && precedence(ch) <= precedence(top->data)) { postfix = insert(postfix, pop()); } push(ch); }
为了应对括号不匹配的异常场景,也可以给右括号处理的循环增加栈非空判断:
// 原逻辑 // while (top->data != '(') // 修复后 while (top != NULL && top->data != '(')
运行验证
修复后运行测试用例(A+B^C)*D+E^5,输出的后缀表达式为ABC^+D*E5^+,符合预期结果。
内容的提问来源于stack exchange,提问作者Rakib Hasan
相关产品推荐
相关产品推荐

