Generyczny stos od podstaw
Parametryczny typowo stos LIFO oparty na alokatorze.
Generyczny stos od podstaw to bezpłatna lekcja Zig Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Zig Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Zig Academy zawiera 4 lekcji w sumie.
Działanie stosu
Stos to kolekcja typu LIFO: ostatni element odłożony na stos jest pierwszym zdjętym. Wyobraź sobie talerze ułożone jeden na drugim na blacie. 🍽️
Uogólnianie typu
Aby przechowywać elementy dowolnego typu, napisz funkcję, która przyjmuje typ i zwraca typ struktury. Każde wywołanie tworzy stos dopasowany do tego typu.
fn Stack(comptime T: type) type {
return struct {};
}Przechowywanie elementów i alokatora
Wewnątrz struktura przechowuje rozszerzalny slice elementów oraz alokator, z którego pożycza pamięć. Zig nigdy nie ukrywa alokacji.
return struct {
items: []T,
len: usize,
alloc: std.mem.Allocator,
};Odwoływanie się do struktury za pomocą @This
Zwracana struktura jest anonimowa, dlatego metody określają jej własny typ za pomocą @This(). Dzięki temu każda metoda pozostaje w pełni generyczna.
const Self = @This();Inicjalizowanie pustego stosu
Funkcja init przyjmuje alokator i zwraca nowy, pusty stos. Do czasu wykonania push nie jest alokowana żadna pamięć.
fn init(a: std.mem.Allocator) Self {
return .{ .items = &.{}, .len = 0, .alloc = a };
}Push może się nie udać
Powiększenie bufora może wymagać pamięci, dlatego push zwraca unię błędu. Kod wywołujący jawnie obsługuje brak pamięci.
fn push(self: *Self, value: T) !void {
// grow then store
}Ponowne użycie realloc do powiększania
Aby zrobić miejsce, poproś alokator o wykonanie realloc dla slice'a i zwiększenie jego rozmiaru. Nowa długość zależy od przyjętej strategii powiększania.
self.items = try self.alloc.realloc(self.items, self.len + 1);
self.items[self.len] = value;
self.len += 1;Zdejmowanie wartości ze szczytu
pop zwraca wartość opcjonalną: element ze szczytu, jeśli stos nie jest pusty, albo null, gdy jest pusty. Pusty stos nie powoduje awarii.
fn pop(self: *Self) ?T {
if (self.len == 0) return null;
self.len -= 1;
return self.items[self.len];
}Zwalnianie zaalokowanej pamięci
Ponieważ bufor należy do Państwa, trzeba go zwrócić. Metoda deinit zwalnia slice za pomocą tego samego alokatora.
fn deinit(self: *Self) void {
self.alloc.free(self.items);
}Używanie stosu
Zbuduj konkretny typ, wywołując funkcję, a następnie go zainicjalizuj. Stack(i32) to rzeczywisty, w pełni sprawdzony typ gotowy do przechowywania liczb całkowitych.
var s = Stack(i32).init(allocator);
defer s.deinit();
try s.push(42);Jedna definicja, wiele stosów
Wywołaj funkcję z różnymi typami, a każdy wynik będzie osobnym, wyspecjalizowanym stosem. Stack(u8) i Stack(f64) nie współdzielą przypadkowo kodu.
Szybkie sprawdzenie
Generyczny stos potrzebuje pamięci sterty, aby rosnąć. Skąd pochodzi ta pamięć?
Podsumowanie
Generyczny stos to funkcja zwracająca typ, przechowująca elementy oraz alokator. Push powiększa stos, pop zwraca wartość opcjonalną, a deinit zwalnia pamięć. 🎯
Często zadawane pytania
Czy lekcja „Generyczny stos od podstaw” jest bezpłatna?
Tak — pełny tekst „Generyczny stos od podstaw” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Zig Academy, przejdź na CoddyKit PRO. Kurs Zig Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Generyczny stos od podstaw”?
Parametryczny typowo stos LIFO oparty na alokatorze. Ćwiczysz Zig Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Zig Academy?
Nie wymagamy żadnego doświadczenia. Zig Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Generyczny stos od podstaw”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Zig Academy?
Tak. Każda lekcja Zig Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Generyczny stos od podstaw
- Jednokierunkowa lista wiązana
- Korzystanie z HashMap i AutoHashMap
- Profilowanie i kompromisy bezpieczeństwa