循环队列是一种线性数据结构,其中的操作是基于FIFO规则执行的,最后一个位置又连接到第一个位置构成一个圆,也称为“环形缓冲区”。
循环队列的好处之一是可以利用队列前面的空间。在普通队列中,一旦队列已满,即使队列前面有空间,也无法插入下一个元素。但是在循环队列中,可以使用前面空间来存储新值。
问题:设计支持以下操作的循环队列。
❑MyCircularQueue(k):构造函数,将队列的大小设置为 k 。
❑Front():从队列中获取最前面的元素。如果队列为空,则返回-1。
❑Rear():从队列中获取最后一个元素。如果队列为空,则返回-1。
❑enQueue(value):将元素value插入循环队列。如果操作成功,则返回True。
❑deQueue():从循环队列中删除一个元素。如果操作成功,则返回True。
❑isEmpty():检查循环队列是否为空。
❑isFull():检查循环队列是否已满。
思路:定义一个大小为 k 的数组,利用两个指针,一个指向数组的头部,一个指向数组的尾部。如果头尾相同,则队列为空;如果头尾差值等于 k ,那么数组就是满的。插入队列之前,需要检查队列是否为满,如果满的话,则返回False,否则加入队列尾部,同时更新尾部指针。要从队列删除一个元素,首先检查队列是否为空,如果为空的话,则返回False,否则删除队列的头部,同时更新头指针。
代码清单4-4 设计循环队列