Menu
Coddy logo textTech

Pilha Genérica

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 60 de 61.

challenge icon

Desafio

Fácil

Uma 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 struct Stack com três membros: um array void** para os itens, um int para o índice do topo (próximo espaço livre) e um int para 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 ponteiro
    • push: adiciona um item ao topo se houver espaço (quando top for menor que capacity)
    • 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, e 0 caso contrário
    • free_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: push seguido de um valor inteiro, pop ou peek. Crie uma pilha com capacidade 10. Para push, aloque um inteiro no heap e insira 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 os 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)

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

20
20
10

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

empty
42

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

15
5

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

Pratique por conta própria: Compilador de C online