Pilha (dimensão variável)

From Wiki**3

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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