use std::fmt::Debug;
// 定义泛型结构体Stack<T>
struct Stack<T> {
items: Vec<T>,
}
impl<T: Clone + Debug> Stack<T> {
// 关联函数new_with_capacity,初始化栈的容量
fn new_with_capacity(capacity: usize) -> Self {
Stack {
items: Vec::with_capacity(capacity),
}
}
// 关联函数pop_if,根据闭包条件弹出栈顶元素
fn pop_if(&mut self, f: impl Fn(&T) -> bool) -> Option<T> {
if let Some(top) = self.items.last() {
if (f)(top) {
return self.items.pop();
}
}
None
}
}
设计思路说明
- 结构体定义:定义了一个泛型结构体
Stack<T>
,它有一个Vec<T>
类型的字段items
,用于存储栈中的元素。
- 类型约束:在
impl
块中对T
添加了Clone
和Debug
的trait约束,确保在new_with_capacity
函数使用T
的相关功能时能够编译通过,例如Vec
的某些操作可能需要元素类型实现Clone
。
new_with_capacity
函数:这个函数接受一个usize
类型的参数capacity
,使用Vec::with_capacity
方法预先为items
分配足够的空间,从而提高后续插入元素的效率。
pop_if
函数:该函数接受一个闭包f
作为参数,闭包接受&T
类型参数并返回bool
。首先通过self.items.last()
获取栈顶元素的引用,如果存在栈顶元素且闭包对栈顶元素返回true
,则使用self.items.pop()
弹出栈顶元素并返回,否则返回None
。