Не знаю, единственные ли это ваши проблемы, но на ум приходят две вещи:
Как отметил @rici, ваша precedence
функция работает не так, как вы думаете. Правильно будет:
int precedence(char ch){
switch(ch){
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '^':
return 3;
default:
return-1;
}
}
Когда вы проверяете приоритет, у вас есть следующее условие:
while(!isempty&&precedence(isfront(stack))>=precedence(exp[i]))
Это никогда не сработает, потому что !isempty
всегда будет иметь значение false. Вы спрашиваете здесь, является ли адрес функции isempty
нулевым. Это не. Что вы действительно хотите сделать, это проверить, пуст ли стек:
while(!isempty(stack) && precedence(isfront(stack))>=precedence(exp[i]))
Это вызовет функцию isempty
.
Вы действительно должны научиться использовать свой отладчик. Один шаг вашего кода быстро выявит ошибки, которые я отметил выше.
Несколько замечаний о вашей реализации стека.
У вас есть скрытая ошибка в pop
. Если кто-то вызывает его, когда стек пуст, он либо аварийно завершает работу, потому что вы пытаетесь получить доступ к array[-1]
, либо ему удается получить доступ к array[-1]
и возвращать поддельное значение. Лучше проверить значение top
и выдать исключение (или вывести программу с сообщением), чем возвращать неверное значение. В зависимости от клиентов звонить isEmpty
до звонка pop
ненадежно.
У вас есть похожая ошибка в push
. Попытка получить доступ за пределами массива - неопределенное поведение. Программа может продолжать работать, и может произойти сбой. В случае push
вы можете в итоге нажать значение, которое впоследствии будет изменено чем-то другим, и тогда pop
вернет значение, которое вы не выдвинули.
Из-за ошибки в pop
ваша функция isEmpty
также содержит ошибку. Если top
когда-либо уменьшится ниже -1
, isEmpty
вернет false
. Вместо проверки на == -1
, вы должны проверить на < 0
. Даже если вы решите проблему pop
, проверка на < 0
лучше. Глубокая защита.
Имя функции, которая смотрит на вершину стека, не выталкивая ее, обычно называется peek
, а не isfront
.