class CircularQueue: def __init__(self, cap=10): self.capacity = cap # 循环队列的容量 self.entry = [None for x in range(0, self.capacity)] self.front = 0 self.rear = self.capacity - 1 def serve(self): # 循环队列出队操作 if _________: # 判断循环队列是否为空 return None else: item = self.entry[self.front] # 保存将要出队的元素 ________ # 修改头指针 return item
class CircularQueue:
def __init__(self, cap=10):
self.capacity = cap # 循环队列的容量
self.entry = [None for x in range(0, self.capacity)]
self.front = 0
self.rear = self.capacity - 1
def serve(self): # 循环队列出队操作
if _________: # 判断循环队列是否为空
return None
else:
item = self.entry[self.front] # 保存将要出队的元素
________ # 修改头指针
return item
题目解答
答案
从题目可以看出,在给出的代码中,缺少了判断循环队列是否为空的条件和修改头指针的语句。
以下对代码进行分析:
__init__(self, cap=10)函数初始化了一个容量为10的循环队列。self.entry = [None for x in range(0, self.capacity)]语句表明元素x不在该队列中, self.front = 0表示队头指针,在队列第一个位置,self.rear = self.capacity - 1表示队尾指针,在队列最后一个位置。同时因为是循环队列,所以队头指针与队尾指针是相邻的。
serve(self)函数定义了循环队列的出队操作。如思路点拨所述,当队头和队尾指针在同一位置时,队列为空。因此当队尾指针后移一个位置则会与队头指针重合(指向同一个位置)。故此处代码为self.front == (self.rear + 1) % self.capacity,注意一定要对容量进行取余操作来保证指针处于合理的范围,否则将会越界。又因为队列是先进先出的,所以当元素出队后需要将头指针向后移动一位,避免出队后原来的位置一直被占据,故此处代码为:self.front = (self.front + 1) % self.capacity,同样一定要对容量进行取余操作。
综上所述:
第一空为:self.front == (self.rear + 1) % self.capacity
第二空为:self.front = (self.front + 1) % self.capacity
解析
循环队列为空的条件是队头指针和队尾指针相邻,即队头指针等于队尾指针的下一个位置。由于队列是循环的,所以需要对容量进行取余操作,以确保指针在合理范围内。因此,判断条件为:`self.front == (self.rear + 1) % self.capacity`。
步骤 2:修改头指针
当元素出队后,需要将头指针向后移动一位,以避免出队后原来的位置一直被占据。同样,由于队列是循环的,所以需要对容量进行取余操作,以确保指针在合理范围内。因此,修改头指针的语句为:`self.front = (self.front + 1) % self.capacity`。