📜  循环队列数据结构(1)

📅  最后修改于: 2023-12-03 15:25:37.723000             🧑  作者: Mango

循环队列数据结构

循环队列是一种将队列的队尾和队头相连而形成的环形结构的队列。它的特点是能够充分利用数组空间,有效缓解顺序队列中插入元素时可能会浪费空间的问题。

数据结构

循环队列的数据结构通常由以下几个元素构成:

  • 队列起始位置 front
  • 队列结束位置 rear
  • 队列长度 size
  • 存储数据的数组 data
class CircularQueue:
    def __init__(self, capacity: int):
        self.capacity = capacity
        self.front = 0
        self.rear = -1
        self.size = 0
        self.data = [None] * capacity
基本操作

循环队列的基本操作包括入队、出队、获取队头元素和判断队列是否为空。

入队操作

循环队列的入队操作,需要先判断队列是否已满,如果已满则抛出异常。否则,将数据插入到队列末尾,并更新队列结束位置。

def enqueue(self, val: int) -> bool:
    if self.is_full():
        return False
    self.rear = (self.rear + 1) % self.capacity
    self.data[self.rear] = val
    self.size += 1
    return True
出队操作

循环队列的出队操作,需要先判断队列是否为空,如果为空则抛出异常。否则,将队头元素出队,并更新队列起始位置。

def dequeue(self) -> int:
    if self.is_empty():
        return None
    val = self.data[self.front]
    self.front = (self.front + 1) % self.capacity
    self.size -= 1
    return val
获取队头元素

循环队列的获取队头元素操作,需要先判断队列是否为空,如果为空则抛出异常。否则,返回队头元素。

def get_front(self) -> int:
    if self.is_empty():
        return None
    return self.data[self.front]
判断队列是否为空

循环队列的判断队列是否为空操作,只需判断队列长度是否为0即可。

def is_empty(self) -> bool:
    return self.size == 0
判断队列是否已满

循环队列的判断队列是否已满操作,只需判断队列长度是否已达到容量即可。

def is_full(self) -> bool:
    return self.size == self.capacity
时间复杂度分析
  • 入队操作的时间复杂度为 O(1)。
  • 出队操作的时间复杂度为 O(1)。
  • 获取队头元素操作的时间复杂度为 O(1)。
  • 判断队列是否为空和队列是否已满的操作时间复杂度均为 O(1)。

因此,循环队列的总体时间复杂度为 O(1)。

应用场景

循环队列广泛应用于多线程编程、操作系统调度等领域,尤其在缓存池、消息队列等需要快速处理大量数据的场景中表现出色。