Причиной ошибки может быть то, что вы не увеличили значение 'i' в другой части while l oop. Это то, что приводит к бесконечному l oop. Кроме того, вы могли ошибочно поместить круглую скобку в условие if для while l oop. Но даже если вы внесете эти изменения, это не даст вам правильных результатов. Я думаю, вы ошибаетесь. Каждый алфавит следует помещать непосредственно в массив postfix, а не в стек. Мы должны проверять приоритеты только операторов, а не алфавитов. Вы можете попробовать реализовать следующий код. Я не использовал связанную реализацию стека, но напрямую использовал стек из STL, но вы можете внести необходимые изменения в соответствии с вашими потребностями. Здесь я вставил дополнительный символ A в стек, чтобы проверить, есть ли в стеке В нем нет операторов.
int prec(char ch){
if(ch == '^')
return 3;
if(ch == '*' or ch == '/')
return 2;
if(ch == '+' or ch == '-')
return 1;
return -1;
}
string infixToPostfix(string x)
{
stack<char> s;
s.push('A');
string ans;
int n = x.length();
for(int i = 0 ; i < n; i++){
if((x[i] >= 'a' and x[i] <= 'z') or (x[i] >= 'A' and x[i] <= 'Z'))
ans += x[i];
else if(x[i] == '(')
s.push(x[i]);
else if(x[i] == ')'){
while(s.top() != 'A' and s.top() != '('){
ans += s.top();
s.pop();
}
if(s.top() == '('){
s.pop();
}
}
else{
while(s.top() != 'A' and prec(x[i]) <= prec(s.top())){
ans += s.top();
s.pop();
}
s.push(x[i]);
}
}
while(s.top() != 'A'){
ans += s.top();
s.pop();
}
return ans;
}
Попробуйте это. Он должен работать! Он также будет работать для выражений, содержащих парантез, например a + b * (c + d) + (f + g)