Escolar Documentos
Profissional Documentos
Cultura Documentos
INTRODUO
Esta dica tem por objetivo a compreenso das pilhas. A escolha de implementao em funo de eventuais necessidades sua. Para explicar o algoritmo, eu usarei uma lista simplesmente ligada (ou encadeada). Assim sendo, a compreenso das listas encadeadas necessria.
II. Definio
A pilha uma estrutura de dados que armazena os dados na ordem LIFO (Last In First Out) em portugus ltimo a Entrar Primeiro a Sair). A recuperao de dados ser feita na ordem inversa de sua insero. Para implementar, escolhi uma lista ligada simplesmente, apresentada na vertical. A insero sempre feita no incio da lista, o primeiro elemento da lista ser o ltimo digitado; assim, a sua posio fica no topo da pilha. Eu no usei um ponteiro fino, como eu fiz no caso das listas simplesmente ligadas, j que o objetivo no abordar uma lista ligada, mas a pilha. O que nos interessa que o ltimo elemento inserido, seja o primeiro recuperado.
==III. A construo do prottipo de um elemento da pilha= Para definir um elemento da pilha ser usado o tipo struct. O elemento da pilha conter um campo dado e um ponteiro "seguinte". O ponteiro "seguinte" deve ser do mesmo tipo que o elemento, caso contrrio ele no poder apontar para o elemento. O ponteiro "seguinte" permitir o acesso para o prximo elemento. typedef struct ElementoLista {
char *dado; struct ElementoLista *seguinte; }Elemento; Para permitir as operaes na pilha, vamos salvar alguns elementos: o primeiro elemento o nmero de elementos
O primeiro elemento, que se encontra no topo da pilha, nos ajudar a realizar a operao de recuperao dos dados situados no topo da pilha. Para faz-lo, outra estrutura diferente ser utilizada (isso no obrigatrio, variveis podem ser utilizadas). Veja a composio: typedef struct ListaDetectada{ Elemento *incio; int tamanho; } Pilha; O ponteiro de incio contm o endereo do primeiro elemento da lista. Observao: Ns no vamos usar um ponteiro fino desta vez (veja as listas simplesmente encadeadas), pois no precisamos, j que s trabalharemos com o incio da lista. Seja qual for a posio na lista, o ponteiro de incio sempre aponta para o primeiro elemento, que estar no topo da pilha. O campo tamanho conter o nmero de elementos da pilha, independentemente da operao efetuada na pilha.
Esta operao deve ser feito antes de qualquer outra operao da pilha. Ela inicializa o ponteiro do incio com o ponteiro NULL incio, e o tamanho com o valor 0. A funo void inicializao (Pilha *monte){ monte->incio = NULL; monte->tamanho = 0; }
Prottipo da funo: int empilhar (Pilha *monte, char *ado); A primeira imagem mostra o incio da insero, portanto, a lista tem o tamanho 1 depois da insero. A caracterstica da pilha no est bem realada com um nico elemento, j que o nico a ser recuperado.
Por outro lado, na segunda imagem podemos observar o comportamento da pilha. O que no devemos esquecer que a integrao sempre feita no topo da pilha (no incio da lista).
A funo /* empilhar (adicionar) um elemento da pilha */ int empilhar (Pilha * monte, char *dado){ Elemento *novo_elemento; if ((novo_elemento = (Elemento *) malloc (sizeof (Elemento))) == NULL) return -1; if ((novo_elemento->dado = (char *) malloc (50 * sizeof (char))) == NULL) return -1; strcpy (novo_elemento->dado, dado); novo_elemento->prximo = monte->incio; monte-> incio = novo_elemento; monte->tamanho++; }
A funo int desempilhar (Pilha * monte){ Elemento *remov_elemento; if (monte->tamanho == 0) return -1; remov_elemento = monte->incio; tas-> incio = tas->incio->prximo; free (remov_elemento->dado); free (remov_elemento); monte ->tamanho--; return 0;
D. Exibir a pilha
Para exibir a pilha inteira, preciso se posicionar no incio da pilha (voc poder fazer isso com o ponteiro de incio). Em seguida, usando o ponteiro "seguinte" de cada elemento, a pilha ser atravessada do primeiro at o ltimo elemento. A condio de parada dada pelo tamanho da pilha. A funo /* exibio da pilha */ void exibe (Pilha * monte){ Elemento *corrente; int i; em curso= monte->incio; for(i=0;i<tas->tamanho;++i){ printf("\t\t%s\n", corrente->dado); em curso = em curso->prximo; } }
#define pilha_dado(monte)
monte->incio->dado
V. Exemplo completo
pilha.h
/*********************\ pilha.h *
/* inicializao */ void inicializao (Pilha *monte); /* EMPILER*/ int empilhar (Pilha *monte, char *dado); /* DESEMPILHAR*/ int desempilhar (Pilha *monte); /* Exibio do elemento no topo da pilha (LastInFirstOut) */ #define pilha_dado(monte) /* Exibe a pilha */ void exibe (Pilha *monte); monte->incio->dado
pile_function.h
/***********************\ pile_function.h *
\***********************/ void inicializao (Pilha *monte){ tas->incio = NULL; tas->tamanho = 0; } /* empilhar (adicionar) um elemento na pilha */ int empilhar (Pilha * monte, char *dado){ Elemento *novo_elemento; if ((novo_elemento = (Elemento *) malloc (sizeof (Elemento))) == NULL) return -1; if ((novo_elemento-> dado = (char *) malloc (50 * sizeof (char))) == NULL) return -1;
strcpy (novo_elemento->dado, dado); novo_elemento->seguinte = monte->incio; monte-> incio = novo_elemento; monte->tamanho++; } /* desempilhar (excluir um elemento da pilhe */ int desempilhar (Pilha * monte){ Elemento *remov_elemento; if (tas->tamanho == 0) return -1; remov_elemento = monte->incio; monte-> incio = monte->incio->seguinte; free (remov_elemento->dado); free (remov_elemento); monte->tamanho--; return 0; } /* exibio da pilha */ void exibe (Pilha * monte){ Elemento *em curso; int i; em curso = monte->incio; for(i=0;i<monte->tamanho;++i){ printf("\t\t%s\n", em curso->dado); em curso = em curso->seguinte; } }