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 C

Quantidade 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
Resposta/Solução:

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;
}


Link para compartilhar na Internet ou com seus amigos:

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

E-Books em PDF

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 17 usuários muito felizes estudando em nosso site.