Pilha Genérica
Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 60 de 61.
Desafio
FácilUma pilha (stack) é 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, completa com 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 slot livre) e umintpara a capacidade. Declare os protótipos das funções para criar uma pilha (recebe uma capacidade), empilhar um item (push), desempilhar um item (pop), espiar o item do topo (peek), 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 fornecida, inicializa o topo em 0 e retorna o ponteiropush— adiciona um item ao topo se houver espaço (quando o topo é menor que a capacidade)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, 0 caso contráriofree_stack— libera primeiro o array de itens e depois a própria struct Stack
main.c: Leia o número de operações a serem realizadas. Então, para cada operação, leia um comando:pushseguido por um valor inteiro,pop, oupeek. Crie uma pilha com capacidade 10. Parapush, aloque um inteiro na heap e empilhe 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 quaisquer itens restantes e a pilha.
Seu programa receberá:
- O número de operações
- Cada operação em uma linha separada (
push X,pop, oupeek)
Exemplo de saída quando as entradas são 5, depois push 10, push 20, peek, pop, pop:
20
20
10Exemplo de saída quando as entradas são 3, depois pop, push 42, peek:
empty
42Exemplo de saída quando as entradas são 4, depois push 5, push 15, pop, pop:
15
5Lembre-se que sua pilha armazena ponteiros void* — o chamador é responsável por alocar e liberar os dados reais. Ao desempilhar, faça o cast do void* retornado de volta para int* para acessar o valor. Use strcmp de <string.h> para comparar as strings de comando.
Experimente você mesmo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack.h"
int main() {
int n;
scanf("%d", &n);
// TODO: Criar uma pilha com capacidade 10
// TODO: Processar 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: Alocar um inteiro no heap e fazer o push do seu ponteiro
}
else if (strcmp(command, "pop") == 0) {
// TODO: Fazer o pop do item
// - Se não for NULL, imprimir o valor e liberar o inteiro
// - Se for NULL (pilha vazia), imprimir "empty"
}
else if (strcmp(command, "peek") == 0) {
// TODO: Espiar (peek) o item do topo
// - Se não for NULL, imprimir o valor (não remover nem liberar)
// - Se for NULL (pilha vazia), imprimir "empty"
}
}
// TODO: Liberar quaisquer itens restantes na pilha
// TODO: Liberar a própria pilha
return 0;
}
Todas as lições de Object Oriented Programming
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írculo