双端队列
双端队列是与队列类似的项的有序集合。deque 有两个端部:首端和尾端。deque 不同于队列的地方就在于项的添加和删除是不受限制的,既可以从首尾两端添加项,也可以从首尾两端移除项。在某种意义上,这种混合线性结构提供了栈和队列的所有功能。
在 Rust 中实现双端队列,使用 Vec 就可以实现。选择 Vec 的左端作为队尾,并选择其右端作为队首。为了避免双端队列无限增长,可以添加 cap 参数,用于控制双端队列长度。
rust
// 双端队列
#[derive(Debug)]
struct Deque<T> {
cap: usize, // 容量
data: Vec<T>, // 数据容器
}
impl<T> Deque<T> {
fn new(cap: usize) -> Self {
Self {
cap,
data: Vec::with_capacity(cap),
}
}
fn is_emptry(&self) -> bool {
0 == self.len()
}
fn is_full(&self) -> bool {
self.cap == self.len()
}
fn len(&self) -> usize {
self.data.len()
}
fn clear(&mut self) {
self.data = Vec::with_capacity(self.cap);
}
// Vec 的末尾为队首
fn add_front(&mut self, val: T) -> Result<(), String> {
if self.cap == self.len() {
return Err("No space available".to_string());
}
self.data.push(val);
Ok(())
}
// Vec 的首部为队尾
fn add_rear(&mut self, val: T) -> Result<(), String> {
if self.cap == self.len() {
return Err("No space available".to_string());
}
self.data.insert(0, val);
Ok(())
}
// 从队首移除数据
fn remove_front(&mut self) -> Option<T> {
if self.len() > 0 {
self.data.pop()
} else {
None
}
}
// 从队尾移除数据
fn remove_rear(&mut self) -> Option<T> {
if self.len() > 0 {
Some(self.data.remove(0))
} else {
None
}
}
// 以下是为双端队列实现的迭代功能
// into_iter: 双端队列改变,成为迭代器
// iter: 双端队列不变,只得到不可变迭代器
// iter_mut: 双端队列不变,得到可变迭代器
fn into_iter(self) -> IntoIter<T> {
IntoIter(self)
}
fn iter(&self) -> Iter<T> {
let mut iterator = Iter { stack: Vec::new() };
for item in self.data.iter() {
iterator.stack.push(item);
}
iterator
}
fn iter_mut(&mut self) -> IterMut<T> {
let mut iterator = IterMut { stack: Vec::new() };
for item in self.data.iter_mut() {
iterator.stack.push(item);
}
iterator
}
}
// 实现三种迭代功能
struct IntoIter<T>(Deque<T>);
impl<T: Clone> Iterator for IntoIter<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
// 元组的第一个元素不为空
if !self.0.is_emptry() {
Some(self.0.data.remove(0))
} else {
None
}
}
}
struct Iter<'a, T: 'a> {
stack: Vec<&'a T>,
}
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
if 0 != self.stack.len() {
Some(self.stack.remove(0))
} else {
None
}
}
}
struct IterMut<'a, T: 'a> {
stack: Vec<&'a mut T>,
}
impl<'a, T> Iterator for IterMut<'a, T> {
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
if 0 != self.stack.len() {
Some(self.stack.remove(0))
} else {
None
}
}
}
fn main() {
basic();
iter();
fn basic() {
let mut d = Deque::new(4);
let _r1 = d.add_front(1);
let _r2 = d.add_front(2);
let _r3 = d.add_rear(3);
let _r4 = d.add_rear(4);
if let Err(error) = d.add_front(5) {
println!("add_front error: {error}");
}
println!("{:?}", d);
match d.remove_rear() {
Some(data) => println!("remove rear data {data}"),
None => println!("empty deque"),
}
match d.remove_front() {
Some(data) => println!("remove front data {data}"),
None => println!("empty deque"),
}
println!("empty: {}, len: {}", d.is_emptry(), d.len());
println!("full: {}, {:?}", d.is_full(), d);
d.clear();
println!("{:?}", d);
}
fn iter() {
let mut d = Deque::new(4);
let _r1 = d.add_front(1);
let _r2 = d.add_front(2);
let _r3 = d.add_rear(3);
let _r4 = d.add_rear(4);
let sum1 = d.iter().sum::<i32>();
let mut addend = 0;
for item in d.iter_mut() {
*item += 1;
addend += 1;
}
let sum2 = d.iter().sum::<i32>();
println!("{sum1} + {addend} = {sum2}");
assert_eq!(14, d.into_iter().sum::<i32>());
}
}output:
shell
add_front error: No space available
Deque { cap: 4, data: [4, 3, 1, 2] }
remove rear data 4
remove front data 2
empty: false, len: 2
full: false, Deque { cap: 4, data: [3, 1] }
Deque { cap: 4, data: [] }
10 + 4 = 14