No sé exactamente que problemas tienes, pero mirándolo así por encima te puedo decir alguna cosa a corregir.
void Pila::EmptyStack() //Verifica si la pila esta vacia,
{ //viendo si el tope esta en -1
top = -1;
}
Esto no hace lo que dice el comentario, lo que hace esta función es limpiar la pila.
Para hacer lo que dice el comentario deberías retornar un booleano y comprobar si el tope es igual a -1
int Pila::Pop() //Esta funcion extrae los elementos de la pila
{
int Aux; //Se crea una variable auxiliar o temporal para poder guardar
if(top == -1) //dentro de la variable Aux el ultimo elemento en entrar
{
cout<<"Se intenta sacar un elemento de una Pila vacia"<<endl;
}
else
{
Aux = A[top]; //Aqui se guarda el elemento del tope osea el ultimo elemento en entrar
top--; //se decrementa el tope y apunta al siguiente elemento y asi sucecivamente hasta que quede en -1
}
return Aux; //se retorna el ultimo elemento del arreglo A[] almacenado en la variable Aux
}
Ten cuidado aquí. En el caso de que la pila esté vacía, estás retornando una variable sin ningún valor de inicialización, así que no puedes saber lo que estas devolviendo. El return debería ir dentro del else.
Además, en cuestión a todos estos mensajes. En el caso de que se esté intentando extraer un elemento de una pila vacía, o no se puede introducir un elemento porque la pila está llena, deberías envíar un error con un aserto o con un throw y parar la ejecución del programa. Un simple mensaje por pantalla no estaría bien.
Supongo que los nombres de las funciones te los mandarían poner en clase así, pero lo normal es que la función Pop() haga lo que hace tu función ClearStack(),y haya una función Top() que haga lo que hace tu función Pop().
Si veo algo más ya vuelvo a postear.