"""
链式存储-队列
linkqueue.py
代码实现
思路:
1.入队,
2.出队,
3.判断空满
""" # 异常类
class QueueError(Exception):
pass # 节点生成类
class Node:
"""
思路:将自定义的类视为节点的生成类,
实例对象中包含数据的部分和下一个节点的next
"""
def __init__(self,val,next = None):
self.val = val # 有用数据
self.next = next # 循环下一个节点的关系 # 链式存储队列类-队头删除,队尾加入,判断空满等
class LinkQueue01:
"""
头尾选择一端做队头,另一端队尾,队头删除,队尾插入,总有一端需要遍历
改进思路:标记头部和尾部,不需要遍历
"""
def __init__(self):
# 标记头部位置
self._first = Node(None) # 队头删除
def dequeue(self):
p = self._first
if p.next is None:
raise QueueError("queue is empty")
else:
p.next = p.next.next # 队尾插入
def enqueue(self, val):
p = self._first
if p.next is None:
p.next = Node(val)
else:
while p.next is not None:
p = p.next
p.next = Node(val) # 判断队列为空
def is_empty(self):
if self._first.next is None:
return True
else:
return False # 遍历队列
def show(self):
# 队列为空时,报异常
if self._first.next is None:
raise QueueError("queue is empty")
else:
p = self._first.next # 第一个有限节点
while p is not None:
print(p.val)
p = p.next # p 向后移动 # print("-"*30)
# if __name__ == "__main__":
# lq = LinkQueue()
# print(lq.is_empty())
# #lq.delete_node()
# # lq.show()
# lq.enqueue(1)
# lq.show()
# print("***")
# # lq.insert_end(2)
# #print(lq.is_empty())
# lq.enqueue(2)
# lq.enqueue(3)
# lq.show()
# print("***")
# lq.enqueue(4)
# lq.show()
# #print(lq.is_empty())
# #lq.dequeue()
# #lq.show()
#-------------------------------------------------
"""
链式队列的另一种实现
重点代码
思路分析:
1.基于链表构建队列模型
2.链表的开端作为队头,结尾位置作为队尾
3.单独定义队尾进行标记,每次插入数据不需要遍历
4.当队头和队尾重叠时,认为队列为空
""" class LinkQueue:
def __init__(self):
# 定义队头队尾属性变量,牺牲节点,
self.front = self.rear = Node(None) # 判断队列空
def is_empty(self):
return self.front == self.rear # 入队操作,rear动
def enqueue(self,val):
self.rear.next = Node(val)
self.rear = self.rear.next # 出队,front动,指向谁,谁出队
def dequeue(self):
if self.front == self.rear:
raise QueueError("queue is empty")
self.front = self.front.next
return self.front.val # 指向他,但实际出队 if __name__ == "__main__":
print("-"*30)
lq = LinkQueue()
lq.enqueue(1)
lq.enqueue(2)
lq.enqueue(3)
lq.enqueue(4)
print(lq.dequeue()) # 1
05-11 18:19