在上一次,我们通过取余等数学方法实现了顺序存储的循环队列。由于我们使用的是Python内置的列表类型作为底层,实际上我们的存储空间并不是首尾相连的。下面,我们使用链式存储结构来实现一个真正首尾相连的循环队列:
class Node(object):
'定义节点。'
def __init__(self):
'初始化:数据域与指针域。'
self.data = None
self.next = None
class Queue(object):
'定义循环链表。'
def __init__(self,MaxSize):
'初始化:建立链式存储空间。'
self.MaxSize = MaxSize
self.size = 0
self.front = None
self.rear = None
self.OpenSpace()
def OpenSpace(self):
'方法:用于初始化。'
node = Node()
self.front = node
self.rear = node #创建第一个节点,将队头指针与队尾指针指向它。
for i in range(self.MaxSize - 1):
node = Node()
self.front.next = node
self.front = node #通过移动队头指针将剩下的节点依次创建并连接。
self.front.next = self.rear
self.front = self.rear #利用队头指针与队尾指针将所有节点连接成环。
def IsEmpty(self):
'方法:判断是否为空队列。'
if self.size == 0:
return True
else:
return False
def IsFull(self):
'方法:判断是否为满队列。'
if self.size == self.MaxSize:
return True
else:
return False
def GetSize(self):
'方法:得到队列长度。'
return self.size
def push(self,data):
'方法:进队。'
if self.IsFull():
raise IndexError('队列已满,无法入队。')
else:
self.rear.next.data = data
self.rear = self.rear.next
self.size += 1
def pop(self):
'方法:出队。'
if self.IsEmpty():
raise IndexError('队列已空,无法出队。')
else:
self.front.data = None
self.front = self.front.next
self.size -= 1
def GetFrontData(self):
'方法:得到队首元素。'
return self.front.data
def GetRearData(self):
'方法:得到队尾元素。'
return self.rear.data
测试:
my_queue = Queue(10)
for i in range(5):
my_queue.push(i + 1)
print('队首元素:{}'.format(my_queue.GetFrontData()))
print('队尾元素:{}'.format(my_queue.GetRearData()))
print('\n')
for i in range(3):
my_queue.pop()
print('队首元素:{}'.format(my_queue.GetFrontData()))
print('队尾元素:{}'.format(my_queue.GetRearData()))
print('\n')
for i in range(5,5 + 8):
my_queue.push(i + 1)
print('队首元素:{}'.format(my_queue.GetFrontData()))
print('队尾元素:{}'.format(my_queue.GetRearData()))
my_queue.push(0)
结果:
队首元素:1
队尾元素:1
队首元素:1
队尾元素:2
队首元素:1
队尾元素:3
队首元素:1
队尾元素:4
队首元素:1
队尾元素:5
队首元素:2
队尾元素:5
队首元素:3
队尾元素:5
队首元素:4
队尾元素:5
队首元素:4
队尾元素:6
队首元素:4
队尾元素:7
队首元素:4
队尾元素:8
队首元素:4
队尾元素:9
队首元素:4
队尾元素:10
队首元素:4
队尾元素:11
队首元素:4
队尾元素:12
队首元素:4
队尾元素:13
Traceback (most recent call last):
File "带链的队列.py", line 112, in <module>
my_queue.push(0)
File "带链的队列.py", line 63, in push
raise IndexError('队列已满,无法入队。')
IndexError: 队列已满,无法入队。