队列

队列简介

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

在队列的形成过程中,可以利用线性链表的原理,来生成一个队列。基于链表的队列,要动态创建和删除节点,效率较低,但是可以动态增长。队列采用的 FIFO(first in first out),新元素(等待进入队列的元素)总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取。每次读取一个元素,释放一个元素。所谓的动态创建,动态释放。因而也不存在溢出等问题。由于链表由结构体间接而成,遍历也方便。

队列实现

下面看一下我们使用 Vec 来实现的简单 Queue:

主要实现的new( ), push( ), pop( )三个方法

  1. #[derive(Debug)]
  2. struct Queue<T> {
  3. qdata: Vec<T>,
  4. }
  5. impl <T> Queue<T> {
  6. fn new() -> Self {
  7. Queue{qdata: Vec::new()}
  8. }
  9. fn push(&mut self, item:T) {
  10. self.qdata.push(item);
  11. }
  12. fn pop(&mut self) -> T{
  13. self.qdata.remove(0)
  14. }
  15. }
  16. fn main() {
  17. let mut q = Queue::new();
  18. q.push(1);
  19. q.push(2);
  20. println!("{:?}", q);
  21. q.pop();
  22. println!("{:?}", q);
  23. q.pop();
  24. }

练习

看起来比我们在上一节实现的Stack简单多了。不过这个Queue实现是有Bug的。

练习:在这个代码的上找到 Bug,并修改。

提示:pop( )方法有 Bug,请参考 Stack 小节的实现,利用 Option 来处理。