Отказ от ответственности: я не внимательно изучил ваш код, просто беглый взгляд.
Ваша функция pop () неправильно сформирована.
if (top == -1)
printf("Error: Stack Underflow\n");
else
{
return stack[top];
top = top -1;
}
1) Я почти уверен, что он даже не скомпилируется (или, по крайней мере, ваш компилятор C выдаст несколько ошибок), потому что если top == -1, то эта функция даже ничего не вернет.
2) Функция возвращает перед обновлением «top». Это означает, что верхний декремент на самом деле никогда не происходит, поэтому стек постоянно индексируется как «top».
Это не может быть прямой причиной вашей ошибки сегмента, но это хорошая отправная точка. В качестве общего предложения в духе @ Ripi2 я предлагаю вам отладить этот код либо с помощью отладчика (например, GDB), операторов printf, либо профилировщика памяти, такого как valgrind.