Skip to content

实现双端队列

rust
/// 双端队列
#[derive(Debug)]
struct Deque<T> {
    capacity: usize,
    data: Vec<T>,
}

/// 实现双端队列
impl<T> Deque<T> {
    fn new(capacity: usize) -> Self {
        Self {
            capacity,
            data: Vec::with_capacity(capacity),
        }
    }

    /// 返回当前长度
    fn size(&self) -> usize {
        self.data.len()
    }

    /// 队列是否为空
    fn is_empty(&self) -> bool {
        self.data.len() == 0
    }

    /// Vec 末尾为队首,添加一个值到队首
    fn add_front(&mut self, value: T) -> Result<(), String> {
        if self.size() >= self.capacity {
            return Err("capacity exceeded".to_string());
        }

        self.data.push(value);

        Ok(())
    }

    /// 从队首移除一个值
    fn remove_front(&mut self) -> Option<T> {
        if self.is_empty() {
            return None;
        }

        self.data.pop()
    }

    // Vec 头部为队尾,添加一个值到队尾
    fn add_rear(&mut self, value: T) -> Result<(), String> {
        if self.size() >= self.capacity {
            return Err("capacity exceeded".to_string());
        }

        self.data.insert(0, value);

        Ok(())
    }

    // 从队尾移除一个值
    fn remove_rear(&mut self) -> Option<T> {
        if self.is_empty() {
            return None;
        }

        Some(self.data.remove(0))
    }
}

fn main() {
    let mut dequeue = Deque::new(5);

    // 依次从头部插入
    dequeue.add_front(1);
    dequeue.add_front(2);
    dequeue.add_front(3);

    // 打印 Deque { capacity: 5, data: [1, 2, 3] }
    println!("{:?}", dequeue);

    // 依次从尾部插入
    dequeue.add_rear(4);
    dequeue.add_rear(5);

    // 超出了最大容量
    if let Err(e) = dequeue.add_rear(6) {
        // 打印 capacity exceeded
        println!("{e}");
    }

    // 打印 Deque { capacity: 5, data: [5, 4, 1, 2, 3] }
    println!("{:?}", dequeue);

    // 打印 5
    println!("{}", dequeue.size());
}

每天进步一丢丢