栈实现中缀转后缀时改if为while循环触发SIGSEGV错误如何解决
问题修复方案
触发SIGSEGV及逻辑错误的原因
- 处理右括号
)的原有逻辑存在两个核心错误:- 错误地将右括号本身
push_back到结果串,而非栈顶的运算符 - 改为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
相关产品推荐
相关产品推荐

