Menu
Coddy logo textTech

Stack generico

Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 60 di 61.

challenge icon

Sfida

Facile

Una pila è una struttura dati fondamentale che segue il principio Last-In-First-Out (LIFO): l’ultimo elemento aggiunto è il primo a essere rimosso. Pensa a una pila di piatti: aggiungi in cima e rimuovi dalla cima.

Creiamo una pila generica: una struttura dati versatile che può memorizzare qualsiasi tipo di dato usando puntatori void*. La tua pila seguirà il principio Last-In-First-Out e includerà tutte le operazioni essenziali.

Organizzerai il codice in tre file:

  • stack.h: definisci la struct Stack con tre membri: un array void** per gli elementi, un int per l’indice della cima (la prossima posizione libera) e un int per la capacità. Dichiara i prototipi delle funzioni per creare una pila (che accetta una capacità), inserire un elemento, rimuovere un elemento, consultare l’elemento in cima, controllare se la pila è vuota e liberare la pila.
  • stack.c: implementa la tua pila generica:
    • create_stack: alloca una Stack nell’heap, alloca l’array degli elementi con la capacità indicata, inizializza top a 0 e restituisce il puntatore
    • push: aggiunge un elemento in cima se c’è spazio (quando top è minore della capacità)
    • pop: rimuove e restituisce l’elemento in cima, oppure restituisce NULL se la pila è vuota
    • peek: restituisce l’elemento in cima senza rimuoverlo, oppure NULL se la pila è vuota
    • is_empty: restituisce 1 se la pila non contiene elementi, altrimenti 0
    • free_stack: libera prima l’array degli elementi, poi la struct Stack stessa
  • main.c: leggi il numero di operazioni da eseguire. Poi, per ogni operazione, leggi un comando: push seguito da un valore intero, pop oppure peek. Crea una pila con capacità 10. Per push, alloca un intero nell’heap e inserisci il suo puntatore. Per pop, recupera l’elemento, stampa il suo valore e libera l’intero. Per peek, stampa il valore senza rimuoverlo. Se si esegue pop o peek su una pila vuota, stampa empty. Dopo tutte le operazioni, libera gli eventuali elementi rimanenti e la pila.

Il tuo programma riceverà:

  1. Il numero di operazioni
  2. Ogni operazione su una riga separata (push X, pop o peek)

Esempio di output quando gli input sono 5, poi push 10, push 20, peek, pop, pop:

20
20
10

Esempio di output quando gli input sono 3, poi pop, push 42, peek:

empty
42

Esempio di output quando gli input sono 4, poi push 5, push 15, pop, pop:

15
5

Ricorda che la tua pila memorizza puntatori void*: il chiamante è responsabile dell’allocazione e della liberazione dei dati effettivi. Quando rimuovi un elemento, converti il void* restituito in int* per accedere al valore. Usa strcmp da <string.h> per confrontare le stringhe dei comandi.

Provalo tu

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack.h"

int main() {
    int n;
    scanf("%d", &n);
    
    // TODO: Crea uno stack con capacità 10
    
    // TODO: Elabora ogni operazione
    for (int i = 0; i < n; i++) {
        char command[10];
        scanf("%s", command);
        
        if (strcmp(command, "push") == 0) {
            int value;
            scanf("%d", &value);
            // TODO: Alloca un intero nell'heap e inserisci il suo puntatore nello stack
        }
        else if (strcmp(command, "pop") == 0) {
            // TODO: Estrai l'elemento dallo stack
            // - Se non è NULL, stampa il valore e libera la memoria dell'intero
            // - Se è NULL (stack vuoto), stampa "empty"
        }
        else if (strcmp(command, "peek") == 0) {
            // TODO: Leggi l'elemento in cima allo stack
            // - Se non è NULL, stampa il valore (senza rimuoverlo né liberarne la memoria)
            // - Se è NULL (stack vuoto), stampa "empty"
        }
    }
    
    // TODO: Libera la memoria degli elementi rimasti nello stack
    // TODO: Libera la memoria dello stack stesso
    
    return 0;
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C online