#define ErroPilhaVazia -1
#define ErroPilhaCheia -2

typedef struct pilha {
  int info;
  pilha *prox;
} Pilha;

//criação de uma pilha vazia
Pilha *criaPilha()
{
return NULL;
}

/* inserção na pilha */
Pilha *Push (Pilha *p, int i)
{
Pilha *novo = (Pilha*) malloc(sizeof(Pilha));
novo->info = i;
novo->prox = p;
return novo;
}

/* função imprime: imprime valores dos elementos */
void imprimePilha (Pilha *p)
{
Pilha *aux;
printf("\nImpressao da pilha: \n");
for (aux = p; aux != NULL; aux = aux->prox)
printf("info = %d\n", aux->info);
printf("======================= fim da pilha");
}

/* função vazia: retorna 1 se vazia ou 0 se não vazia */
int PilhaVazia (Pilha *p)
{
   return (p == NULL);
}

/* função busca: busca um elemento na pilha */
Pilha *Busca (Pilha *p, int v)
{ Pilha *aux;
for (aux=p; aux!=NULL; aux = aux->prox)
{
   if (aux->info == v)
      return aux;
}
return NULL; /* não achou o elemento */
}

/* função retira: retira elemento da pilha */
Pilha *Pop (Pilha *p)
{
  Pilha *aux=p;
  if (PilhaVazia(p))
    printf("\nPilha vazia");
  else
  {
     p=p->prox;
     free(aux);
     return p;
  }
}

void liberaPilha (Pilha *p)
{
Pilha *l = p, *t;
while (l != NULL)
   {
      t = l->prox; /* guarda referência p/ próx. elemento */
      free(l); /* libera a memória apontada por p */
      l = t; /* faz p apontar para o próximo */
   }
}

