Skip to main content

队列

队列(Queue)

  • 队列是一种特殊的线性表,只能在头尾两端进行操作

  • 队尾(rear):只能从队尾添加元素,一般叫做 enQueue, 入队

  • 队头(front):只能从队头移除元素,一般叫做 deQueue, 出队

  • 先进先出的原则, First In First Out, FIFO

image-20220916110624327

队列的接口设计

public interface Queue<E> {

/**
* 清除所有元素
*/
void clear();

/**
* 元素的数量
* @return
*/
int size();

/**
* 是否为空
* @return
*/
boolean isEmpty();

/**
* 入队
* @return
*/
void enQueue(E element);

/**
* 出队
* @return
*/
E deQueue();

/**
* 获取队列的头元素
* @return
*/
E front();
}
  • 队列的内部实现是可以直接使用动态数组、链表
  • 优先使用双向链表,因为队列主要是往头尾操作元素

双端队列(Deque)

  • 双端队列是能在头尾两端添加、 删除的队列
  • 英文 deque 是 double ended queue 的简称

双端队列的接口设计

public interface Deque<E> {

/**
* 清除所有元素
*/
void clear();

/**
* 元素的数量
* @return
*/
int size();

/**
* 是否为空
* @return
*/
boolean isEmpty();

/**
* 从队头入队
* @return
*/
void enQueueFront(E element);

/**
* 从队头出队
* @return
*/
E deQueueFront();

/**
* 从队尾入队
* @return
*/
void enQueueRear(E element);

/**
* 从队尾出队
* @return
*/
E deQueueRear();

/**
* 获取队列的头元素
* @return
*/
E front();
/**
* 获取队列的尾元素
* @return
*/
E rear();
}

循环队列(Circle Queue)

  • 其实队列底层也可以使用动态数组实现,并且各项接口也可以优化到 O(1) 的时间复杂度

  • 这个用动态数组实现并且优化之后的队列也叫做: 循环队列 (如果直接使用链表,则不需要使用循环队列

  • 循环双端队列:可以进行两端添加、删除操作的循环队列

image-20220916111543368

  • 循环队列需要访问下标转化为实际下标

    image-20220916111656202

  • 循环双端队列在队头添元素时,可能会出现下标为负数的情况,这里要做一个判断

image-20220916111810494

  • 尽量避免使用乘*、 除/、 模%、 浮点数运算,效率低下 ,可以使用%运算符优化
    • 已知n>=0, m>0
    • n%m 等价于 n – (m > n ? 0 : m) 的前提条件: n < 2m

image-20220916111929871

作业与练习

练习 – 用栈实现队列

https://leetcode-cn.com/problems/implement-queue-using-stacks/

image-20220916112129198

作业

https://leetcode-cn.com/problems/implement-stack-using-queues/