Pila generica
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 59 di 61.
Sfida
FacileUno 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 genericaStack<T>che usa internamente unVec<T>per memorizzare gli elementi. Implementa tre metodi:newper creare uno stack vuoto,pushper aggiungere un elemento in cima epopper rimuovere e restituire l'elemento in cima (restituendoOption<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. Usaunwrap_orper gestire il valoreOptionrestituito da pop; se lo stack è vuoto, usa-1come 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
-1Per esempio, con gli input 5, 15 e 25:
25
15
5
-1Riceverai 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
1Metodi e comportamento
Introduzione ai blocchi implIl parametro selfMetodi mutabiliFunzioni associateBlocchi impl multipliConcatenamento di metodiRiepilogo - Azioni sul rettangolo4Progetto: animale domestico virtuale
Definire l'animaleNutrire l'animale7Trait standard
Il trait DebugIl trait DisplayClone e CopyTrait di uguaglianzaRiepilogo - Punto stampabile10Progetto: sistema di documenti
Il trait DrawComponente di testo2Incapsulamento e moduli
Nozioni di base sui moduliLa parola chiave publicCampi privatiGetterSetterRiepilogo - Armadietto sicuro5Generics
Struct genericheMetodi genericiPiù tipi genericiFunzioni genericheRipasso - Punto di coordinate8I Trait come vincoli
Sintassi dei vincoli sui traitVincoli multipliLa clausola whereRestituire tipi con i traitRiepilogo - Stampante generica11Modelli di progettazione in Rust
Pattern NewtypeComposizioneIl trait DropFrom e IntoRipasso - Mock con smart pointer3Enumerazioni avanzate
Enumerazioni con datiMetodi sulle enumerazioniCorrispondenza delle varianti con datiL'enumerazione Option ripresaRiepilogo - enumerazione Shape6Definizione dei trait
Che cos’è un trait?Implementare i traitImplementazioni predefiniteSovrascrivere le implementazioni predefiniteTrait con parametriRiepilogo - Lettore multimedialeEsercitati da solo: Compilatore Rust online