Stos generyczny
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 59 z 61.
Wyzwanie
ŁatwyStos to podstawowa struktura danych, która działa zgodnie z zasadą „ostatni wchodzi, pierwszy wychodzi” (LIFO): ostatni dodany element jest usuwany jako pierwszy. Wyobraź sobie stos talerzy: dodajesz talerze na górze i zdejmujesz je z góry.
Zbudujmy generyczną strukturę danych Stack, która może przechowywać elementy dowolnego typu! Stos działa zgodnie z zasadą „ostatni wchodzi, pierwszy wychodzi”, podobnie jak stos książek, na którym możesz dodawać lub zdejmować książki tylko z góry.
Rozmieścisz swój kod w dwóch plikach:
stack.rs: Zdefiniuj generyczną strukturęStack<T>, która wewnętrznie używaVec<T>do przechowywania elementów. Zaimplementuj trzy metody:newdo tworzenia pustego stosu,pushdo dodawania elementu na górę orazpopdo usuwania i zwracania elementu ze szczytu (zwracaOption<T>, ponieważ stos może być pusty).main.rs: Zaimportuj moduł stosu i pokaż działanie stosu na liczbach całkowitych. Utwórz stos, umieść na nim podane liczby, a następnie zdejmij elementy i wypisz każdy z nich. Użyjunwrap_ordo obsługi wartościOptionzwracanej przezpop; jeśli stos jest pusty, użyj-1jako wartości domyślnej.
Stos wymaga dwóch podstawowych operacji:
- push: dodaje element na górę stosu
- pop: usuwa i zwraca element ze szczytu
Metoda pop powinna zwracać Option<T>, ponieważ stos może być pusty. Typ Vec ma już metodę pop, która zwraca Option<T>; możesz wykorzystać ją w swojej implementacji.
Twój stos powinien działać następująco: gdy umieścisz na nim wartości 10, 20 i 30 (w tej kolejności), trzykrotne zdjęcie elementu powinno dać 30, 20 i 10 (w odwrotnej kolejności). Czwarte zdjęcie z pustego stosu powinno zwrócić wartość domyślną.
Wypisz każdą zdjętą wartość w osobnym wierszu:
30
20
10
-1Na przykład dla danych wejściowych 5, 15 i 25:
25
15
5
-1Otrzymasz trzy dane wejściowe: trzy liczby całkowite, które należy umieścić na stosie (każdą sparsuj jako i32). Po umieszczeniu wszystkich trzech liczb zdejmij elementy cztery razy, aby pokazać zarówno poprawne zdjęcie elementów, jak i przypadek pustego stosu.
Spróbuj swoich sił
mod stack;
use stack::Stack;
fn main() {
// Wczytaj trzy liczby całkowite z wejścia
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: Utwórz nowy Stack
// TODO: Umieść trzy liczby na stosie (num1, num2, num3 w tej kolejności)
// TODO: Zdejmij element ze stosu cztery razy i wypisz każdy wynik
// Użyj unwrap_or(-1), aby obsłużyć przypadek pustego stosu
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Metody i zachowanie
Wprowadzenie do bloków implementacjiParametr selfMetody modyfikująceFunkcje powiązaneWiele bloków implementacjiŁańcuchowe wywoływanie metodPowtórzenie — działania na prostokącie4Projekt: Wirtualne zwierzątko
Definiowanie zwierzątkaKarmienie zwierzątka7Standardowe cechy
Cecha DebugCecha DisplayClone i CopyCechy równościPowtórka – punkt do wydrukowania10Projekt: System dokumentów
Trait DrawKomponent tekstowy2Hermetyzacja i moduły
Podstawy modułówSłowo kluczowe publicPola prywatneGetterySetteryPodsumowanie — bezpieczna skrytka5Typy generyczne
Struktury generyczneMetody generyczneWiele typów generycznychFunkcje generycznePodsumowanie – punkt współrzędnych8Cechy jako ograniczenia
Składnia ograniczeń cechWiele ograniczeńKlauzula whereZwracanie typów z użyciem cechPodsumowanie — generyczna drukarka11Wzorce projektowe w Rust
Wzorzec NewtypeKompozycjaTrait DropFrom i IntoPodsumowanie — atrapowy inteligentny wskaźnik3Zaawansowane typy wyliczeniowe
Typy wyliczeniowe z danymiMetody typów wyliczeniowychDopasowywanie wariantów danychTyp wyliczeniowy Option — powtórzeniePodsumowanie — typ wyliczeniowy Shape6Definiowanie cech
Czym jest cecha?Implementowanie cechImplementacje domyślneNadpisywanie wartości domyślnychCechy z parametramiPowtórzenie — odtwarzacz multimedialnyPoćwicz samodzielnie: Kompilator Rust online