La función scanf lee un caracter a la vez y lo guarda en la dirección de memoria del objeto cadena. Si eso funciona, es por casualidad, ya que &cadena es un puntero a array de char, y lo correcto sería poner ahí un puntero a char.
Luego la función isalpha necesita que se le pase como argumento un char (en realidad, un int, pero para el caso vale igual, por las conversiones), pero le has pasado cadena, que es un array de char, el cual decae allí a un puntero a char.
No sé cómo has definido push y pop, pero si los has definido para alojar punteros, en cada iteración se te sobreescribirán los valores.
En general, creo que tendrías que tomar una decisión de diseño, a ver si vas a trabajar con datos que son caracteres individuales, o cadenas de caracteres.
Lo que yo haría es leer una línea completa de texto con fgets(cadena,sizeof(cadena),stdin) (gets ha sido eliminada de C),
en la variable cadena,
para no estar leyendo permanentemente datos externos,
y luego trabajar en forma más segura con la cadena almacenada.
Además, al guardar los datos (con push, como indica Abdulai), no sé si estás almacenando algún indicador que informe de qué tipo de caracter se trata.