Menu
CoddyTech

泛型栈

本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 59 课,共 61 课。

challenge icon

挑战

简单

栈是一种基本的数据结构,遵循“后进先出”(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 在线编译器