2、定义一个循环队列,并实现对循环队列的以下操作 (1)初始化 (2)入队 (3)出队 (4)求循环队列的长度 (5)取循环队列的队头元素 (6)显示队列中各元素的值 (7)用循环队列实现舞伴问题
时间: 2024-10-30 22:05:57 浏览: 39
循环队列是一种特殊的线性表,它将队列的两端连接起来形成一个环形结构。这样,当队列满时,新的元素会从队尾开始存储,而旧的元素会被新元素“覆盖”。以下是循环队列的基本操作以及如何在Python中实现:
```python
class CircularQueue:
def __init__(self, size):
"""
初始化循环队列,设初始容量为size,front和rear分别为队首和队尾指针,默认初始化为空
"""
self.queue = [None] * size
self.front = -1
self.rear = -1
def is_empty(self):
"""
判断队列是否为空
"""
return self.front == -1 and self.rear == -1
def enqueue(self, item):
"""
入队操作,如果队列为满,则需要扩展容量
"""
if (self.rear + 1) % len(self.queue) == self.front:
self._resize(len(self.queue) * 2)
if self.is_empty():
self.front = 0
else:
self.front = (self.front + 1) % len(self.queue)
self.queue[self.rear] = item
self.rear = (self.rear + 1) % len(self.queue)
def dequeue(self):
"""
出队操作,如果队列为空则抛出异常
"""
if self.is_empty():
raise IndexError("Dequeue from empty queue")
item = self.queue[self.front]
if self.front == self.rear:
self.front = self.rear = -1
else:
self.front = (self.front + 1) % len(self.queue)
return item
def get_length(self):
"""
返回循环队列的长度(实际元素个数)
"""
if self.is_empty():
return 0
else:
return (self.rear + 1 - self.front) % len(self.queue)
def get_front(self):
"""
取循环队列的队头元素
"""
if self.is_empty():
return None
else:
return self.queue[(self.front + 1) % len(self.queue)]
def display(self):
"""
显示队列中各元素的值
"""
if self.is_empty():
print("Queue is empty.")
else:
index = self.front + 1
while index != self.rear:
print(self.queue[index], end=" ")
index = (index + 1) % len(self.queue)
# 如果队尾未到达队首,打印最后一个元素
if self.front != self.rear:
print(self.queue[self.rear])
def _resize(self, new_size):
"""
队列满时的扩容操作
"""
temp_queue = [None] * new_size
for i in range((self.rear - self.front + 1) % len(self.queue)):
temp_queue[i] = self.queue[(self.front + i) % len(self.queue)]
self.queue = temp_queue
self.front = 0
self.rear = (self.rear + 1) % new_size
# 示例使用
cq = CircularQueue(5)
cq.enqueue(1)
cq.enqueue(2)
cq.display() # 输出: 1 2
print(cq.get_length()) # 输出: 2
cq.dequeue()
cq.display() # 输出: 2
```
在这个实现中,我们首先定义了一个`CircularQueue`类,包含各种操作方法。例如,`enqueue()`用于入队,`dequeue()`用于出队,`get_length()`返回队列长度,`get_front()`获取队头元素,`display()`展示队列内容。
对于舞伴问题(Partner Problem),你可以将其视为一种特殊的循环队列应用。在一个社交活动中,每个人都有一个舞伴,每次有新人加入,就需要找到尚未配对的人作为他们的舞伴。这里可以利用循环队列的特性,在每个新成员到来时,先查看队列头部是否有空位(即队首和队尾是否相等),如果没有,就按照先进先出的原则找到下一个合适的舞伴。这需要在上述实现的基础上添加相应的逻辑处理。
阅读全文