Menu
Coddy logo textTech

Pila generica

Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 59 di 61.

challenge icon

Sfida

Facile

Uno stack è 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 i piatti in cima e li rimuovi dalla cima.

Costruiamo una struttura dati generica Stack che può contenere elementi di qualsiasi tipo! Uno stack segue il principio "Last In, First Out", come una pila di libri da cui puoi aggiungere o rimuovere elementi solo dalla cima.

Organizzerai il codice in due file:

  • stack.rs: Definisci la struttura generica Stack<T> che usa internamente un Vec<T> per memorizzare gli elementi. Implementa tre metodi: new per creare uno stack vuoto, push per aggiungere un elemento in cima e pop per rimuovere e restituire l'elemento in cima (restituendo Option<T>, dato che lo stack potrebbe essere vuoto).
  • main.rs: Importa il modulo dello stack e mostra il funzionamento di Stack con gli interi. Crea uno stack, inserisci i numeri forniti, poi rimuovi gli elementi e stampa ciascuno di essi. Usa unwrap_or per gestire il valore Option restituito da pop; se lo stack è vuoto, usa -1 come valore predefinito.

Uno stack richiede due operazioni essenziali:

  • push: aggiunge un elemento in cima allo stack
  • pop: rimuove e restituisce l'elemento in cima

Il metodo pop dovrebbe restituire un Option<T>, dato che lo stack potrebbe essere vuoto. Il tipo Vec ha già un metodo pop che restituisce un Option<T>, che puoi sfruttare nella tua implementazione.

Il tuo stack dovrebbe funzionare così: quando inserisci i valori 10, 20 e 30 (in quest'ordine), rimuovendo gli elementi tre volte dovresti ottenere 30, 20 e 10 (in ordine inverso). Una quarta rimozione da uno stack vuoto dovrebbe restituire il valore predefinito.

Stampa ogni valore rimosso su una riga separata:

30
20
10
-1

Per esempio, con gli input 5, 15 e 25:

25
15
5
-1

Riceverai tre input: tre interi da inserire nello stack (analizza ciascuno come i32). Dopo averli inseriti tutti e tre, rimuovi elementi quattro volte per mostrare sia le rimozioni riuscite sia il caso dello stack vuoto.

Provalo tu

mod stack;

use stack::Stack;

fn main() {
    // Leggi tre numeri interi dall'input
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let num1: i32 = input1.trim().parse().expect("Invalid number");

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let num2: i32 = input2.trim().parse().expect("Invalid number");

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let num3: i32 = input3.trim().parse().expect("Invalid number");

    // TODO: Crea un nuovo Stack

    // TODO: Inserisci i tre numeri nello stack (num1, num2, num3 in quest'ordine)

    // TODO: Esegui pop quattro volte e stampa ogni risultato
    // Usa unwrap_or(-1) per gestire il caso in cui lo stack sia vuoto
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Rust online