参考《大话数据结构》4.12一节,基于顺序结构实现了循环队列。
- 在循环队列中,队列为空时,头指针与尾指针值相等;
- 队列满时,存在两种情况:
- 尾指针在头指针后,此时,
rear + 1 - Queue_Size = front
- 尾指针在头指针前,此时,
rear + 1 = front
- 尾指针在头指针后,此时,
- 队列满时,可以统一用下述公式判断:
(rear + 1) % Queue_Size = front
循环队列相比单纯的顺序存储,时间性能较好,入队和出队均为O(1)。
但仍然面临着数组可能会溢出的问题,而链式存储结构无需担心队列长度,因此下一篇博客将基于链式存储结构实现队列。
class SeqQueue(object):
def __init__(self, size=10):
self.MAXSIZE = size
self.data = [' '] * size
self.front = 0 # 头指针
self.rear = 0 # 尾指针
def __len__(self):
return (self.rear - self.front + self.MAXSIZE) % self.MAXSIZE # 返回队列实际大小
def __str__(self):
s = ''
head = self.front
tail = self.rear
while head != tail:
s += '%s ' % self.data[head]
head = (head + 1) % self.MAXSIZE
return s
def enqueue(self, value):
# 判断队列是否已满
if (self.rear + 1) % self.MAXSIZE == self.front:
raise OverflowError('当前队列已满,无法添加数据!')
self.data[self.rear] = value
self.rear = (self.rear + 1) % self.MAXSIZE
return True
def dequeue(self):
# 判断队列是否为空
if self.front == self.rear:
raise OverflowError('当前队列为空!')
value = self.data[self.front]
self.front = (self.front + 1) % self.MAXSIZE
return value
if __name__ == '__main__':
q = SeqQueue(20)
q.enqueue(10)
q.enqueue(14)
q.enqueue(33)
print(q)
q.dequeue()
q.dequeue()
print(q)
以上,欢迎交流指正!