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 construir 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, incluindo todas as operações essenciais.
Você organizará seu código em três arquivos:
stack.h: defina a structStackcom três membros: um arrayvoid**para os itens, umintpara o índice do topo (próximo espaço livre) e umintpara a capacidade. Declare os protótipos das funções para criar uma pilha (recebe uma capacidade), inserir um item, remover um item, consultar o item no topo, verificar se a pilha está vazia e liberar a pilha.stack.c: implemente sua pilha genérica:create_stack: aloca uma Stack no heap, aloca o array de itens com a capacidade fornecida, 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, ouNULLse estiver vaziais_empty: retorna 1 se a pilha não tiver itens, e 0 caso contráriofree_stack: libera primeiro o array de itens e, em seguida, a própria struct Stack
main.c: leia o número de operações a serem realizadas. 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 no heap e insira seu ponteiro. Parapop, recupere o item, imprima seu valor e libere o inteiro. Parapeek, imprima o valor sem removê-lo. Sepopoupeekfor chamado em uma pilha vazia, imprimaempty. Após 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)
Saída de exemplo quando as entradas são 5, depois push 10, push 20, peek, pop, pop:
20
20
10Saída de exemplo quando as entradas são 3, depois pop, push 42, peek:
empty
42Saída de exemplo quando as entradas são 4, depois push 5, push 15, pop, pop:
15
5Lembre-se de que sua pilha armazena ponteiros void*: o chamador é responsável por alocar e liberar os dados reais. Ao remover um item, converta o void* retornado novamente 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: Espie o item do topo
// - Se não for NULL, imprima o valor (não remova nem libere)
// - Se for NULL (pilha vazia), imprima "empty"
}
}
// TODO: Libere quaisquer 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çalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do CírculoImplementação do RetânguloUso PolimórficoContainer de FormasPratique por conta própria: Compilador de C online