Как вы правильно обнаружили в сеансе отладки, вы не видите операторов в выражении postfix , потому что вы никогда не push()
добавляете их в свой стек.
Фактически
- в первом
if
вы проверяете alphanumeri c символов - в следующем
else if
вы проверяете открывающую скобку - во втором
else if
вас проверьте закрывающую скобку - в финале, иначе вы управляете
pop
s из стека ... но вы ничего не набрали sh ! (1)
Нужно исправить последние else
, где у вас есть как минимум две различные проблемы:
- Вы получаете доступ к
st[top]
без проверки значения top
. Вам нужно управлять случаем, в котором top = -1
, это привело бы к выходу за пределы массива стека и к неопределенному поведению. Я думаю, что в этом сценарии вам просто нужно набрать sh оператора - Вы пу sh в стеке
st[i]
. Возможно, вы имели в виду s[i]
Таким образом, при анализе выражения становится
while(s[i]!='\0')
{
if(isalnum(s[i]))
printf("%c ",s[i]);
else if(s[i] == '(' )
push(s[i]);
else if(s[i] == ')')
{
while((x=pop())!='(')
printf("%c ",x);
}
else
{
if( top != -1 )
{
while(priority(st[top])>=priority(s[i]))
printf("%c ",pop());
}
push(s[i]);
}
i++;
}
Ввод:
4*6+3
Выход:
4 6 * 3 +
(я добавил дополнительный пробел после каждого %c
в printf
с, чтобы улучшить читаемость вывода).
Примечание : Вам все еще нужно исправить некоторые проблемы в управлении приоритетами операторов.