#c 11 #segmentation-fault #stack #postfix-notation #infix-operator
Вопрос:
Когда я попытался сделать условие if в цикл while, чтобы удалить больше, чем один оператор из стека в кронштейн (ф г/ч) здесь выход должен быть (fghбыл/ ), но я не могу запустить код с циклом while мой вывод идет (fghбыл/) благодаря условие if , как я могу поместить цикл while без сигнала SIGSEGV, я получаю ошибку времени выполнения сигнала SIGSEGV ?
#include<bits/stdc .h>
using namespace std;
class Solution
{
public:
//Function to convert an infix expression to a postfix expression.
string infixToPostfix(string s)
{
// Your code here
stack<char> op;
string res;
int i=0;
while(i<s.length()){
if(s[i]>='a' amp;amp; s[i]<='z' || s[i]>='A' amp;amp; s[i]<='Z' ){
res.push_back(s[i]);
cout<<res<<" ";
}
else if(s[i]=='(')
op.push(s[i]);
else if(s[i]==')'){
if(op.top()!='('){ //here SIGSEGV I want this in while loop not if statement
res.push_back(s[i]);
op.pop();
cout<<res<<" ";
}
op.pop();
}
else {
if(op.empty())
op.push(s[i]);
else if(precedence(s[i])>precedence(op.top()))
op.push(s[i]);
else if(precedence(s[i])<precedence(op.top())){
while(precedence(s[i])<precedence(op.top())){
res.push_back(op.top());
op.pop();
}
op.push(s[i]);
}
else{
res.push_back(op.top());
op.pop();
op.push(s[i]);
}
}
i ;
}
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;
}
};
int main(){
int t;
t=1;
cin.ignore(INT_MAX, 'n');
while(t--){
string exp;
cin>>exp;
Solution ob;
cout<<ob.infixToPostfix(exp)<<endl;
}
return 0;
}
Комментарии:
1.
res.push_back(s[i]);
должно бытьres.push_back(op.top());
. С этим исправлением и заменойif
наwhile
, как вы себе представляете, пример работает для меня2. Да , я уже исправил op.top (), спасибо, что теперь он работает, не мог найти, почему он показывал sigsegv, в любом случае спасибо!!!