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: 444 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: ----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------
#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 |
|
Python - Como tratar o evento wx.EVT_PAINT em suas aplicações wxPython - Interfaces gráficas no Python |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
|
1º lugar: Java |






