泛型栈
本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 59 课,共 61 课。
挑战
简单栈是一种基本的数据结构,遵循“后进先出”(LIFO)原则:最后添加的元素最先移除。你可以把它想成一摞盘子:从顶部放入盘子,也从顶部取走盘子。
让我们来构建一种通用的 Stack 数据结构,它可以存储任意类型的元素!栈遵循“后进先出”原则,就像一摞书,你只能从顶部放入或取出书。
你需要将代码写在两个文件中:
stack.rs:定义通用的Stack<T>结构体,在内部使用Vec<T>存储元素。实现三个方法:使用new创建空栈,使用push在栈顶添加元素,使用pop移除并返回栈顶元素(由于栈可能为空,因此返回Option<T>)。main.rs:引入栈模块,并演示如何用整数操作 Stack。创建一个栈,将提供的数字压入栈中,然后依次弹出元素并打印。使用unwrap_or处理pop返回的Option。如果栈为空,请使用-1作为默认值。
栈需要两个基本操作:
- push:在栈顶添加元素
- pop:移除并返回栈顶元素
pop 方法应返回 Option<T>,因为栈可能为空。Vec 类型本身就有一个返回 Option<T> 的 pop 方法,你可以在实现中使用它。
你的栈应该像这样工作:依次压入值 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) 处理栈为空的情况
}
面向对象编程中的所有课
自己练习: Rust 在线编译器