Menu
Coddy logo textTech

Stos generyczny

Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 59 z 61.

challenge icon

Wyzwanie

Łatwy

Stos 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żywa Vec<T> do przechowywania elementów. Zaimplementuj trzy metody: new do tworzenia pustego stosu, push do dodawania elementu na górę oraz pop do usuwania i zwracania elementu ze szczytu (zwraca Option<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żyj unwrap_or do obsługi wartości Option zwracanej przez pop; jeśli stos jest pusty, użyj -1 jako 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
-1

Na przykład dla danych wejściowych 5, 15 i 25:

25
15
5
-1

Otrzymasz 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

Poćwicz samodzielnie: Kompilator Rust online