Uno stack generico da zero
Implementi una struttura LIFO parametrica rispetto al tipo su un allocator.
Uno stack generico da zero è una lezione Zig Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Zig Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Zig Academy include 4 lezioni in totale.
Che cosa fa uno stack
Uno stack è una raccolta LIFO: l’ultimo elemento inserito è il primo a essere estratto. Lo si può immaginare come un piatto impilato sopra gli altri. 🍽️
Renderlo generico
Per contenere elementi di qualsiasi tipo, scriva una funzione che riceve un tipo e restituisce un tipo struct. Ogni chiamata produce uno stack specializzato per quel tipo.
fn Stack(comptime T: type) type {
return struct {};
}Memorizzare gli elementi e un allocator
Al suo interno, la struct conserva uno slice espandibile di elementi e l’allocator da cui prende in prestito la memoria. Zig non nasconde mai le allocazioni.
return struct {
items: []T,
len: usize,
alloc: std.mem.Allocator,
};Fare riferimento alla struct con @This
La struct restituita è anonima, quindi i metodi indicano il proprio tipo con @This(). In questo modo ogni metodo rimane completamente generico.
const Self = @This();Inizializzare uno stack vuoto
Una funzione init riceve l’allocator e restituisce uno stack nuovo e vuoto. Non viene allocato nulla finché non esegue un push.
fn init(a: std.mem.Allocator) Self {
return .{ .items = &.{}, .len = 0, .alloc = a };
}Push può fallire
L’espansione del buffer può richiedere memoria, quindi push restituisce una union di errori. Chi lo chiama gestisce esplicitamente il caso di memoria insufficiente.
fn push(self: *Self, value: T) !void {
// grow then store
}Riutilizzare realloc per espandere
Per fare spazio, chieda all’allocator di eseguire realloc dello slice portandolo a una dimensione maggiore. La nuova lunghezza dipende dalla politica di espansione.
self.items = try self.alloc.realloc(self.items, self.len + 1);
self.items[self.len] = value;
self.len += 1;Estrarre il valore in cima
pop restituisce un optional: l’elemento in cima se lo stack ne contiene uno, oppure null quando è vuoto. Uno stack vuoto non provoca arresti anomali.
fn pop(self: *Self) ?T {
if (self.len == 0) return null;
self.len -= 1;
return self.items[self.len];
}Liberare ciò che è stato allocato
Poiché il buffer è di Sua proprietà, deve restituirlo. Un metodo deinit libera lo slice tramite lo stesso allocator.
fn deinit(self: *Self) void {
self.alloc.free(self.items);
}Utilizzarlo
Crei un tipo concreto chiamando la funzione, quindi lo inizializzi. Stack(i32) è un tipo reale, verificato completamente e pronto a contenere interi.
var s = Stack(i32).init(allocator);
defer s.deinit();
try s.push(42);Una definizione, molti stack
Chiami la funzione con tipi diversi e ciascun risultato sarà uno stack separato e specializzato. Stack(u8) e Stack(f64) non condividono accidentalmente il codice.
Verifica rapida
Per espandersi, il Suo stack generico ha bisogno di memoria nell’heap. Da dove proviene questa memoria?
Riepilogo
Uno stack generico è una funzione che restituisce un tipo e contiene elementi più un allocator. Push lo espande, pop restituisce un optional e deinit libera la memoria. 🎯
Domande Frequenti
La lezione «Uno stack generico da zero» è gratuita?
Sì — il testo completo di «Uno stack generico da zero» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Zig Academy, passa a CoddyKit PRO. Il corso Zig Academy include 4 lezioni in totale.
Cosa imparerò in «Uno stack generico da zero»?
Implementi una struttura LIFO parametrica rispetto al tipo su un allocator. Eserciti Zig Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Zig Academy?
Non è richiesta alcuna esperienza precedente. Zig Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Uno stack generico da zero»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Zig Academy?
Sì. Ogni lezione Zig Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Uno stack generico da zero
- Una lista semplicemente concatenata
- Utilizzare HashMap e AutoHashMap
- Profilazione e compromessi sulla sicurezza