Menu
Coddy logo textTech

Pilha Genérica

Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 60 de 61.

challenge icon

Desafio

Fácil

Uma 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 struct Stack com três membros: um array void** para os itens, um int para o índice do topo (próximo slot livre) e um int para 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 ponteiro
    • push — 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 retorna NULL se a pilha estiver vazia
    • peek — retorna o item do topo sem removê-lo, ou NULL se estiver vazia
    • is_empty — retorna 1 se a pilha não tiver itens, 0 caso contrário
    • free_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: push seguido por um valor inteiro, pop, ou peek. Crie uma pilha com capacidade 10. Para push, aloque um inteiro na heap e empilhe seu ponteiro. Para pop, recupere o item, imprima seu valor e libere o inteiro. Para peek, imprima o valor sem removê-lo. Se pop ou peek for chamado em uma pilha vazia, imprima empty. Após todas as operações, libere quaisquer itens restantes e a pilha.

Seu programa receberá:

  1. O número de operações
  2. Cada operação em uma linha separada (push X, pop, ou peek)

Exemplo de saída quando as entradas são 5, depois push 10, push 20, peek, pop, pop:

20
20
10

Exemplo de saída quando as entradas são 3, depois pop, push 42, peek:

empty
42

Exemplo de saída quando as entradas são 4, depois push 5, push 15, pop, pop:

15
5

Lembre-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