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

栈实现中缀转后缀时改if为while循环触发SIGSEGV错误如何解决

问题修复方案

触发SIGSEGV及逻辑错误的原因

  • 处理右括号)的原有逻辑存在两个核心错误:
    1. 错误地将右括号本身push_back到结果串,而非栈顶的运算符
    2. 改为while循环时没有先判断栈是否非空,当栈空时调用op.top()直接触发段错误
  • 优先级比较的循环未判断栈非空,栈弹空后调用op.top()也会触发崩溃
  • 遍历完所有输入字符后,未将栈中剩余的运算符全部弹出追加到结果末尾
  • precedence函数缺少默认返回值,极端情况会出现未定义行为

修正后的完整代码

#include<bits/stdc++.h>
using namespace std;

class Solution
{
    public:
    //Function to convert an infix expression to a postfix expression.
    string infixToPostfix(string s)
    {
        stack<char> op;
        string res;
        int i=0;
        while(i<s.length()){
            if((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z')){
                res.push_back(s[i]);
            }
            else if(s[i]=='(')
                op.push(s[i]);
            else if(s[i]==')'){
                // 增加栈非空判断,循环弹出直到遇到左括号
                while(!op.empty() && op.top()!='('){
                    res.push_back(op.top());
                    op.pop();
                }
                // 弹出左括号,不加入结果
                if(!op.empty())
                    op.pop();
            }
            else {
                // 优先级判断先检查栈非空,合并同优先级处理逻辑
                while(!op.empty() && precedence(s[i]) <= precedence(op.top())){
                    res.push_back(op.top());
                    op.pop();
                }
                op.push(s[i]);
            }
            i++;
        }
        // 弹出栈中剩余的所有运算符
        while(!op.empty()){
            res.push_back(op.top());
            op.pop();
        }
        return res;
    }
    int precedence(char a)   //precedence function
    {
        if (a == '^')
            return 3;
        else if (a == '*' || a == '/')
            return 2;
        else if (a == '+' || a == '-')
            return 1;
        else if (a == '(' || a == ')')
            return 0;
        return 0; // 补充默认返回值避免未定义行为
    }
};

int main(){
    int t=1;
    while(t--){
        string exp;
        cin>>exp;
        Solution ob;
        cout<<ob.infixToPostfix(exp)<<endl;
    }
    return 0;
}

验证效果

输入表达式f+g/h,输出结果为fgh/+,符合预期。

内容的提问来源于stack exchange,提问作者Yash_3001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:15:02