Pilha (dimensão variável)

From Wiki**3

Exemplo de pilha de strings de dimensão arbitrária (variável).

Ficheiro pilha.h

  /* resultado da operação de colocação na pilha */
  enum resultado { FALHA, SUCESSO };
  /* declarações das funções */
  void           inicia  (struct pilha *p);
  unsigned char  vazia   (struct pilha *p);
  size_t         tamanho (struct pilha *p);
  enum resultado push    (struct pilha *p, char *dados);
  char          *pop     (struct pilha *p);

Ficheiro pilha.c

Implementação da pilha.

 /* estrutura que representa a pilha */
 struct pilha {
   struct elemento *topo;
   size_t n;
 };

 /* elemento constituinte da pilha */
 struct elemento {
   char *dados;
   struct elemento *outro;
 };

A função inicia prepara a pilha para ser a utilizada.

 void inicia(struct pilha *p) {
   if (p == NULL) return;           /* argumento inválido? */
   p->topo = NULL;
   p->n    = 0;
 }

A função vazia retorna um valor diferente de zero se a pilha estiver vazia.

 unsigned char vazia(struct pilha *p) {
   return !p || p->topo == NULL;
 }

A função tamanho retorna o número de elementos da pilha.

 size_t tamanho(struct pilha *p) {
   return p ? p->n : 0;
 }

A função push insere novos elementos na pilha. Note-se o processo de reserva de memória: a pilha, além de reservar espaço para novos nós, também reserva espaço para os dados.

 enum resultado push(struct pilha *p, char *dados) {
   struct elemento *e = NULL;
   if (dados == NULL || p == NULL) return FALHA;  /* args inválidos? */
 
   if ((e = (struct elemento*)malloc(sizeof(struct elemento))) == NULL)
     return FALHA;
 
   if ((e->dados = (char*)malloc((1+strlen(dados))*sizeof(char))) == NULL) {
     free(e);
     return FALHA;
   }
 
   strcpy(e->dados, dados);
   e->outro = p->topo;
   p->topo  = e;
   p->n++;
   return SUCESSO;
 }

Note-se que a função pop apenas liberta o espaço correspondente a um nó da pilha, não libertando o espaço dos dados.

 char *pop(struct pilha *p) {
   struct elemento *e = NULL;
   if (vazia(p)) return NULL;     /* pilha vazia? */
   e = p->topo;
   p->topo = p->topo->outro;
   p->n--;
   char *pd = e->dados;           /* ponteiro para os dados  */
   free(e);                       /* liberta nó (malloc em push) */
   return pd;
 }

Ver Também