Обобщенный стек
Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 59 из 61.
Задание
Легкоstack — это фундаментальная структура данных, которая следует принципу "Last In, First Out" (LIFO): последний добавленный item удаляется первым. Представь стопку тарелок: ты добавляешь тарелки наверх и удаляешь их сверху.
Давай создадим generic структуру данных Stack, способную хранить любой тип element! stack следует принципу "Last In, First Out", как стопка книг, в которую можно добавлять или из которой можно удалять только сверху.
Ты организуешь код в двух файлах:
stack.rs: Define genericStack<T>struct, который usesVec<T>internally для хранения элементов. Implement three methods:newдля создания empty stack,pushдля добавления element наверх иpopдля удаления и возврата верхнего element (возвращаяOption<T>, поскольку stack может быть empty).main.rs: Подключи модуль stack и продемонстрируй работу твоего Stack с integers. Create stack, добавь предоставленные numbers с помощью push, затем извлеки elements с помощью pop и print каждый из них. Используйunwrap_orдля обработкиOption, возвращаемого pop; если stack empty, используй-1как значение по умолчанию.
stack требует двух основных операций:
- push: adds element наверх stack
- pop: removes и returns верхний element
Метод pop должен возвращать Option<T>, поскольку stack может быть empty. Тип Vec уже имеет метод pop, который returns Option<T>; ты можешь использовать его в своей реализации.
Твой stack должен работать следующим образом: если выполнить push значений 10, 20 и 30 (в этом order), то pop, выполненный three times, должен дать 30, 20 и 10 (в reverse order). Четвёртый pop для empty stack должен вернуть значение по умолчанию.
Выведи каждое извлечённое значение в отдельной строке:
30
20
10
-1Например, для inputs 5, 15 и 25:
25
15
5
-1Ты получишь three inputs: three integers, которые нужно добавить в stack (parse каждый как i32). После добавления всех three значений выполни pop four times, чтобы продемонстрировать как успешные операции pop, так и случай empty stack.
Попробуйте сами
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) для обработки случая пустого стека
}
Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust