📜  门|门 IT 2008 |第 82 题(1)

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

门|门 IT 2008 |第 82 题

这道题是门|门 IT 2008 中的一道编程题,需要求解循环队列的题目。

题目描述

有一个长度为 $N$ 的循环队列,初始时队列为空。现在需要支持两种操作:

  • 入队操作:将元素 $x$ 入队。
  • 出队操作:弹出队首元素。

要求入队操作保证队列不会溢出,即在 $N$ 个元素都入队,再进行入队操作时,队列应该已满,不能再入队。出队操作保证队列不会为空,即在队列为空时进行出队操作应该报错。

请你设计一个数据结构,实现上述两种操作。

解题思路

循环队列一般使用数组实现,队头和队尾指针分别指向队首和队尾元素,入队时队尾指针向后移动,出队时队头指针向后移动。

但是循环队列有两种情况需要特别注意:

  1. 队列为空时进行出队操作会导致指针越界,需要检查队列是否为空。
  2. 队列已满时进行入队操作会导致指针后移后回到队头,需要将队尾指针和队头指针模 $N$ 后在比较大小。
代码实现

以下是 Python 代码实现,使用了一个列表来模拟循环队列。

class MyCircularQueue:
    def __init__(self, k: int):
        self.queue = [0] * k
        self.head = 0
        self.tail = 0
        self.size = k
        
    def enQueue(self, value: int) -> bool:
        if self.isFull():
            return False
        self.queue[self.tail] = value
        self.tail = (self.tail + 1) % self.size
        return True
        
    def deQueue(self) -> bool:
        if self.isEmpty():
            return False
        self.head = (self.head + 1) % self.size
        return True
        
    def Front(self) -> int:
        if self.isEmpty():
            return -1
        return self.queue[self.head]
        
    def Rear(self) -> int:
        if self.isEmpty():
            return -1
        return self.queue[(self.tail - 1 + self.size) % self.size]
        
    def isEmpty(self) -> bool:
        return self.head == self.tail
        
    def isFull(self) -> bool:
        return (self.tail + 1) % self.size == self.head

以上代码中,enQueue() 方法用于入队操作,deQueue() 方法用于出队操作,Front() 方法用于获取队首元素,Rear() 方法用于获取队尾元素,isEmpty() 方法用于检查队列是否为空,isFull() 方法用于检查队列是否已满。

总结

循环队列是一个很常见的数据结构,在实际工程中也会用到。理解循环队列的性质及实现方式对于编程能力的提升有一定帮助。