上一篇博文,我们提到在使用顺序队列时出现的假溢出问题,今天我们就来谈谈如何解决顺序队列的假溢出问题。
循环队列
当进行动态创建队列的时候,也只不过是向后继续不断的申请内存空间,即时前面出队操作释放掉了前面的空间,但是指针依旧会向后进行移动,直到达到系统预留给程序的内存上界被强行终止,这对于极为频繁的队列操作和程序而言是致命的,这时候,就需要对我们的队列进行优化,使用更为优秀的结构——循环队列。
初始化时直接创建两个游标指针,分别指向头结点和尾结点即可。
入队操作同顺序队列的方法,直接将rear向后移动即可,但是要注意判断,如果rear达到了队列的空间上限,将要从头节点继续开始移动
如果顺序队列的出队操作,直接将front进行后移一位即可,注意这时候有一个需要留意的地方,即队列是否为空,当队列为空的时候是无法进行出队操作的
接下来代码实现一下循环队列:
class Node(object):
"""结点类"""
def __init__(self, item):
"""实例属性初始化和赋值"""
self.item = item
self.next = None
class Queue(object):
def __init__(self, head=None, end=None):
# 初始化头结点游标指针
self.head = head
# 初始化尾结点游标指针
self.end = end
def AddNode(self, item):
"""添加节点数据"""
node = Node(item)
# 队列为空的情况
if self.head is None:
self.head = node
self.end = node
return
# 队列不为空的情况,每个队列都会有一个容量上限,假设我们循环队列容量为100
if self.length() < 100:
cur = self.end
cur.next = node
self.end = node
return
# 如果容量达到上限,尾结点的下一结点的链接域直接指向头结点
else:
cur = self.end
cur.next = self.head
return
def RemoveNode(self):
"""删除节点数据"""
# 队列特性,先进先出
if self.head:
cur = self.head
self.head = cur.next
return
def length(self):
"""返回队列长度"""
if self.head:
# 构建游标和计数器
cur = self.head
count = 0
# 循环查找下一结点,不存在则终止
while cur is not None:
cur = cur.next
count += 1
return count
else:
return 0
if __name__ == '__main__':
q = Queue()
print(q.length())
for i in range(1, 111):
if q.length() == 100:
break
else:
q.AddNode(i)
print(q.length())
q.RemoveNode()
print(q.length())