Stack generico
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 60 di 61.
Sfida
FacileUna 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 structStackcon tre membri: un arrayvoid**per gli elementi, unintper l’indice della cima (la prossima posizione libera) e unintper 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 puntatorepush: aggiunge un elemento in cima se c’è spazio (quando top è minore della capacità)pop: rimuove e restituisce l’elemento in cima, oppure restituisceNULLse la pila è vuotapeek: restituisce l’elemento in cima senza rimuoverlo, oppureNULLse la pila è vuotais_empty: restituisce 1 se la pila non contiene elementi, altrimenti 0free_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:pushseguito da un valore intero,popoppurepeek. Crea una pila con capacità 10. Perpush, alloca un intero nell’heap e inserisci il suo puntatore. Perpop, recupera l’elemento, stampa il suo valore e libera l’intero. Perpeek, stampa il valore senza rimuoverlo. Se si eseguepopopeeksu una pila vuota, stampaempty. Dopo tutte le operazioni, libera gli eventuali elementi rimanenti e la pila.
Il tuo programma riceverà:
- Il numero di operazioni
- Ogni operazione su una riga separata (
push X,popopeek)
Esempio di output quando gli input sono 5, poi push 10, push 20, peek, pop, pop:
20
20
10Esempio di output quando gli input sono 3, poi pop, push 42, peek:
empty
42Esempio di output quando gli input sono 4, poi push 5, push 15, pop, pop:
15
5Ricorda 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
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online