Pilha Genérica
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 60 de 61.
Desafio
FácilUma pilha é uma estrutura de dados fundamental que segue o princípio Last-In-First-Out (LIFO): o último elemento adicionado é o primeiro a ser removido. Pense em uma pilha de pratos: você adiciona no topo e remove do topo.
Vamos criar uma pilha genérica: uma estrutura de dados versátil que pode armazenar qualquer tipo de dado usando ponteiros void*. Sua pilha seguirá o princípio Last-In-First-Out e contará com todas as operações essenciais.
Você organizará seu código em três arquivos:
stack.h: Defina a estruturaStackcom três membros: um arrayvoid**para os itens, umintpara o índice do topo (próxima posição livre) e umintpara a capacidade. Declare os protótipos das funções para criar uma pilha (recebe uma capacidade), adicionar um item, remover um item, consultar o item do topo, verificar se a pilha está vazia e liberar a pilha.stack.c: Implemente sua pilha genérica:create_stack: aloca uma Stack na heap, aloca o array de itens com a capacidade informada, inicializa top com 0 e retorna o ponteiropush: adiciona um item ao topo se houver espaço (quando top for menor que capacity)pop: remove e retorna o item do topo ou retornaNULLse a pilha estiver vaziapeek: retorna o item do topo sem removê-lo ou retornaNULLse estiver vaziais_empty: retorna 1 se a pilha não tiver itens, ou 0 caso contráriofree_stack: libera primeiro o array de itens e, em seguida, a própria estrutura Stack
main.c: Leia o número de operações a executar. Em seguida, para cada operação, leia um comando:pushseguido de um valor inteiro,popoupeek. Crie uma pilha com capacidade 10. Parapush, aloque um inteiro na heap e adicione seu ponteiro à pilha. Parapop, obtenha o item, imprima seu valor e libere o inteiro. Parapeek, imprima o valor sem removê-lo. Sepopoupeekfor chamado em uma pilha vazia, imprimaempty. Depois de todas as operações, libere os itens restantes e a pilha.
Seu programa receberá:
- O número de operações
- Cada operação em uma linha separada (
push X,popoupeek)
Exemplo de saída quando as entradas forem 5, depois push 10, push 20, peek, pop, pop:
20
20
10Exemplo de saída quando as entradas forem 3, depois pop, push 42, peek:
empty
42Exemplo de saída quando as entradas forem 4, depois push 5, push 15, pop, pop:
15
5Lembre-se de que sua pilha armazena ponteiros void*: quem chama é responsável por alocar e liberar os dados propriamente ditos. Ao remover um item, converta o void* retornado de volta para int* para acessar o valor. Use strcmp de <string.h> para comparar as strings dos comandos.
Experimente você mesmo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack.h"
int main() {
int n;
scanf("%d", &n);
// TODO: Crie uma pilha com capacidade 10
// TODO: Processe cada operação
for (int i = 0; i < n; i++) {
char command[10];
scanf("%s", command);
if (strcmp(command, "push") == 0) {
int value;
scanf("%d", &value);
// TODO: Aloque um inteiro no heap e empilhe seu ponteiro
}
else if (strcmp(command, "pop") == 0) {
// TODO: Desempilhe o item
// - Se não for NULL, imprima o valor e libere o inteiro
// - Se for NULL (pilha vazia), imprima "empty"
}
else if (strcmp(command, "peek") == 0) {
// TODO: Consulte o item no topo da pilha
// - Se não for NULL, imprima o valor (sem remover nem liberar)
// - Se for NULL (pilha vazia), imprima "empty"
}
}
// TODO: Libere todos os itens restantes na pilha
// TODO: Libere a própria pilha
return 0;
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online