Обобщенный стек
Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 59 из 61.
Задание
ЛегкоСтек — это фундаментальная структура данных, которая следует принципу «последним пришел, первым вышел» (LIFO) — последний добавленный элемент удаляется первым. Представьте себе стопку тарелок: вы добавляете тарелки сверху и снимаете их тоже сверху.
Давайте создадим универсальную структуру данных Stack, которая может хранить элементы любого типа! Стек следует принципу «последним пришел, первым вышел» — как стопка книг, где вы можете добавлять или удалять их только сверху.
Вы организуете свой код в двух файлах:
stack.rs: Определите свою универсальную структуруStack<T>, которая используетVec<T>внутри для хранения элементов. Реализуйте три метода:newдля создания пустого стека,pushдля добавления элемента наверх иpopдля удаления и возврата верхнего элемента (возвращаяOption<T>, так как стек может быть пустым).main.rs: Подключите свой модуль стека и продемонстрируйте работу вашего Stack с целыми числами. Создайте стек, поместите в него предоставленные числа, затем извлеките элементы и выведите каждый из них. Используйтеunwrap_orдля обработкиOption, возвращаемого методом pop — если стек пуст, используйте-1в качестве значения по умолчанию.
Стеку необходимы две основные операции:
- push — добавляет элемент на вершину стека
- pop — удаляет и возвращает верхний элемент
Метод pop должен возвращать Option<T>, так как стек может быть пустым. Тип Vec уже имеет метод pop, который возвращает Option<T>, и вы можете использовать его в своей реализации.
Ваш стек должен работать так: когда вы помещаете значения 10, 20 и 30 (в таком порядке), три последовательных извлечения должны дать вам 30, 20 и 10 (обратный порядок). Четвертое извлечение из пустого стека должно вернуть значение по умолчанию.
Выводите каждое извлеченное значение на отдельной строке:
30
20
10
-1Например, с входными данными 5, 15 и 25:
25
15
5
-1Вы получите три входных значения: три целых числа для добавления в стек (преобразуйте каждое в i32). После добавления всех трех чисел выполните извлечение четыре раза, чтобы продемонстрировать как успешные извлечения, так и случай с пустым стеком.
Попробуйте сами
mod stack;
use stack::Stack;
fn main() {
// Считать три целых числа из ввода
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: Создать новый Stack
// TODO: Поместить три числа в стек (num1, num2, num3 в этом порядке)
// TODO: Извлечь элементы четыре раза и вывести каждый результат
// Используйте unwrap_or(-1) для обработки случая пустого стека
}
Все уроки раздела Object Oriented Programming
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player