跳到主要内容

Circular Queues(循环队列)

考纲要求

  • 19.1.6 Queue ADT 扩展:用 MOD 实现循环回绕

核心代码模板

Queue = [-1] * 20
HeadPointer = -1
TailPointer = -1
NumberItems = 0

def Enqueue(item):
global Queue, HeadPointer, TailPointer, NumberItems
if NumberItems == 20:
return False
if HeadPointer == -1:
HeadPointer = 0
TailPointer = (TailPointer + 1) % 20
Queue[TailPointer] = item
NumberItems = NumberItems + 1
return True

def Dequeue():
global Queue, HeadPointer, TailPointer, NumberItems
if NumberItems == 0:
return -1
item = Queue[HeadPointer]
HeadPointer = (HeadPointer + 1) % 20
NumberItems = NumberItems - 1
return item

循环队列 + 记录类型版本

class SaleRecord:
def __init__(self):
self.ID = ""
self.quantity = 0

CircularQueue = [SaleRecord() for _ in range(5)]
Head = 0
Tail = 0
NumberOfItems = 0

def EnqueueRecord(record):
global CircularQueue, Head, Tail, NumberOfItems
if NumberOfItems == 5:
return -1
CircularQueue[Tail] = record
Tail = (Tail + 1) % 5
NumberOfItems = NumberOfItems + 1
return 1

def DequeueRecord():
global CircularQueue, Head, Tail, NumberOfItems
if NumberOfItems == 0:
return None
record = CircularQueue[Head]
Head = (Head + 1) % 5
NumberOfItems = NumberOfItems - 1
return record

关键区别

特性线性队列循环队列
Tail 变化Tail = Tail + 1Tail = (Tail + 1) % size
满判断Tail >= sizeNumberItems == size
空判断Head == -1 or Head >= TailNumberItems == 0
Head 变化Head = Head + 1Head = (Head + 1) % size

常见错误

  • 用 Head == Tail 判断空/满(不可靠,只能用 NumberItems)
  • 忘记更新 NumberItems
  • MOD 运算错误