Menu
CoddyTech

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 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 estrutura Stack com três membros: um array void** para os itens, um int para o índice do topo (próxima posição livre) e um int para 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 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 retorna NULL se estiver vazia
    • is_empty: retorna 1 se a pilha não tiver itens, ou 0 caso contrário
    • free_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: push seguido de um valor inteiro, pop ou peek. Crie uma pilha com capacidade 10. Para push, aloque um inteiro na heap e adicione seu ponteiro à pilha. Para pop, obtenha 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. Depois de 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)

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

20
20
10

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

empty
42

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

15
5

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

Pratique por conta própria: Compilador de C online