在一开始写用链表实现队列的时候,当时很蠢,没想到使用链表的变形来进行操作,所以写的程序效率非常低,后来就去学了以下单链表的变形。在用链表实现队列的时候由于是一端入队,另一端出队的操作,并且链表的首端尾front,后端尾rear,在进行入队操作的时候需要不断的链表的尾端插入数据,如果使用传统的单链表的方法来写,每一次入队的时间复杂度的都是O(n),效率太低,此时,如果稍稍修改一下,添加一个尾结点域,就是添加一个指向:头结点始终指向尾结点,此时,每次进行入队操作的时间复杂度就变成了O(1),大大的降低了操作的复杂度。
链表实现队列不限制长度的代码实现:
# author HeiJack
# Time 2021-6-28
# 队的链表实现
# 不设置队的长度
# 链表首端为front,尾端为rear
'''之前写的很有问题,入队操作应该增加尾结点域来提高运行效率
效率可以从O(n)提升到O(1)'''
class Node:
def __init__(self, elem):
self.elem = elem
self.next = None
class LLQueue(object):
# 头结点的创建
def __init__(self):
self.head = None # 头结点域
self.rear = None # 尾结点域
# 判断是否为空
def isempty(self):
return self.head is None
# 入队
def enqueue(self, elem):
# 空表
if self.rear is None:
self.rear = Node(elem)
self.head = self.rear
'''当尾结点为空时,首结点必为空,不可能出现尾结点为None
而首结点不为None的情况'''
else:
self.rear.next = Node(elem)
self.rear = self.rear.next
# 出队
def dequeue(self):
'''出队操作就是删除首结点,不难理解,很简单'''
if self.head is None:
return print('queue is empty')
else:
e = self.head.elem
self.head = self.head.next
return e
# 取得队首元素
'''与出队操作类似'''
def plast(self):
if self.head is None:
return print("queue is empty")
else:
return self.head.elem
# 遍历并打印
def travel(self):
q = self.head
while q is not None:
print(q.elem)
q = q.next
if __name__ == '__main__':
qu = LLQueue()
for i in range(13):
qu.enqueue(i)
for i in range(6):
qu.dequeue()
qu.travel()
qu.isempty()
qu.plast()
实验结果:
链表实现队列限制长度的代码实现:
# author HeiJack
# Time 2021-6-28
# 队的链表实现
# 设置队的长度
# 链表首端为front,尾端为rear
class Node:
def __init__(self, elem):
self.elem = elem
self.next = None
class LLQueue(object):
'''这里有rear,num,head三个变量需要不断的维护'''
def __init__(self, size): # size 是队的长度
self. head = None
self.rear = None # 尾结点域
self.num = 0 # 队现有的长度num
self. size = size # 规定队的长度size
# 入队
def enqueue(self, elem):
'''由于前端是front,后端是rear,所以入队操作是在链表的最后添加元素,需要
频繁的在链表尾部添加元素,所以这里增加一个尾结点域来提升程序的效率'''
# 空表
if self.rear is None:
self.rear = Node(elem)
self.head = self.rear
self.num = self.num + 1
else:
self.rear.next = Node(elem)
self.rear = self.rear.next
self.num = self.num + 1
# 出队
def dequeue(self):
if self.num == 0:
return print('queue is empty')
else:
q = self.head
self.head = q.next
self.num = self.num - 1
# 遍历并打印
def travel(self):
q = self.head
while q is not None:
print(q.elem)
q = q.next
if __name__ =='__main__':
q = LLQueue(42)
q.enqueue(5)
q.enqueue(9)
q.enqueue(53)
q.dequeue()
q.travel()
实验结果: