Você está aqui: C ::: Desafios e Lista de Exercícios Resolvidos ::: Estruturas de Dados - Pilhas |
Crie uma pilha com as funcionalidades de empilhar, desempilhar, exibir a pilha, exibir o meio da pilha e excluir o nó no meio da pilha - Exercícios Resolvidos de CQuantidade de visualizações: 214 vezes |
Pergunta/Tarefa: A Pilha é uma estrutura de dados do tipo LIFO - Last-In, First-Out (Último a entrar, primeiro a sair). Neste tipo de estrutura, o último elemento a ser inserido é o primeiro a ser removido. Veja a imagem a seguir: ![]() Crie uma pilha usando uma lista encadeada simples com as funcionalidades de empilhar, desempilhar, exibir a pilha, exibir o meio da pilha e excluir o nó no meio da pilha. Seu código deverá usar alocação dinâmica de memória. O uso de vetores e matrizes na resolução não é permitida. Sua saída deverá ser parecida com: Informe o valor a ser empilhado: 7 O nó no meio da pilha é: 7 Informe o valor a ser empilhado: 4 O nó no meio da pilha é: 7 Informe o valor a ser empilhado: 2 O nó no meio da pilha é: 4 Informe o valor a ser empilhado: 9 O nó no meio da pilha é: 4 Informe o valor a ser empilhado: 5 O nó no meio da pilha é: 2 Os elementos da pilha são: 5 9 2 4 7 A pilha sem o elemento do meio: 5 9 4 7 Veja a resolução comentada deste exercício usando C: #include <stdio.h> #include <stdlib.h> // estrutura usada para representar os nós da pilha struct No { int valor; // valor do nó struct No* proximo; // aponta para o próximo nó struct No* anterior; // aponta para o nó anterior }; // estrutura que representa a pilha. Note os ponteiros para // o nó do topo, o nó do meio e um contador de nós struct Pilha { struct No* topo; struct No* meio; int contador; }; // função usada para empilhar um novo elemento na pilha void empilhar(struct Pilha* pilha, int valor) { // vamos reservar memória para um novo nó struct No* novo_no = (struct No*)malloc(sizeof(struct No)); // definimos o valor do novo nó novo_no->valor = valor; // o anterior do novo nó não aponta para ninguém novo_no->anterior = NULL; // o próximo do novo nó aponta para o topo da pilha novo_no->proximo = pilha->topo; // agora atualizamos o meio da pilha baseado no número de // nós que temos até agora if (pilha->contador == 0) { pilha->meio = novo_no; } else if (pilha->contador % 2 == 0) { pilha->meio = pilha->meio->anterior; } // atualizamos o ponteiro anterior do nó no topo if (pilha->topo != NULL) { pilha->topo->anterior = novo_no; } // finalmente atualizamos o ponteiro topo e // incrementamos o contador pilha->topo = novo_no; pilha->contador++; } // função usada para desempilhar um elemento da pilha int desempilhar(struct Pilha* pilha) { // vamos obter o nó que está no topo da pilha struct No* topo = pilha->topo; int valor = topo->valor; // ajustamos o topo da pilha para o nó seguinte pilha->topo = topo->proximo; // agora precisamos ajustar o ponteiro anterior if (pilha->topo != NULL) { pilha->topo->anterior = NULL; } // liberamos a memória do ponteiro que removemos free(topo); // atualizamos o ponteiro do meio baseado no // número de elementos if (pilha->contador % 2 == 1) { pilha->meio = pilha->meio->proximo; } // diminuimos o contador pilha->contador--; // e retornamos o valor do nó removido return valor; } // função para obter o nó no meio da pilha int obter_meio(struct Pilha* pilha) { return pilha->meio->valor; } // função usada para excluir o nó do meio da pilha void excluir_meio(struct Pilha* pilha) { // vamos obter uma referência ao nó no meio da pilha struct No* no_meio = pilha->meio; // temos que atualizar os ponteiros de acordo com o número // de elementos if (pilha->contador == 1) { pilha->topo = NULL; pilha->meio = NULL; } else { if (pilha->contador % 2 == 0) { pilha->meio = pilha->meio->proximo; } else { pilha->meio = pilha->meio->anterior; } no_meio->anterior->proximo = no_meio->proximo; no_meio->proximo->anterior = no_meio->anterior; } // liberamos a memória ocupada pelo nó removido free(no_meio); // e reduzimos o contador pilha->contador--; } // função usada para exibir os nós da pilha void exibir_pilha(struct Pilha* pilha) { // vamos obter uma referência ao nó no topo da pilha struct No* atual = pilha->topo; while (atual != NULL) { printf("%d ", atual->valor); atual = atual->proximo; } printf("\n"); } // função principal do programa int main(int argc, char *argv[]) { int i, valor; // vamos criar uma pilha vazia struct Pilha pilha = {NULL, NULL, 0}; // vamos adicionar elementos na pilha for (i = 0; i < 5; i++) { printf("Informe o valor a ser empilhado: "); scanf("%d", &valor); empilhar(&pilha, valor); // mostra o elemento do meio da pilha printf("O no no meio da pilha e: %d\n", obter_meio(&pilha)); } // vamos mostrar os elementos na lista printf("\nOs elementos da pilha sao:\n"); exibir_pilha(&pilha); // vamos excluir o no no meio da pilha excluir_meio(&pilha); // vamos mostrar os elementos na lista printf("\nA pilha sem o elemento do meio:\n"); exibir_pilha(&pilha); printf("\n\n"); system("PAUSE"); return 0; } |
![]() |
Mais Desafios de Programação e Exercícios e Algoritmos Resolvidos de C |
Veja mais Dicas e truques de C |
Dicas e truques de outras linguagens |
Delphi - Como usar o controle TStringGrid em suas aplicações Delphi - O componente TStringGrid do Delphi |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |