You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:54:03