"""链式存储-队列
linkqueue.py
代码实现
思路:
1.入队,
2.出队,
3.判断空满"""
#异常类
classQueueError(Exception):pass
#节点生成类
classNode:"""思路:将自定义的类视为节点的生成类,
实例对象中包含数据的部分和下一个节点的next"""
def __init__(self,val,next =None):
self.val= val #有用数据
self.next = next #循环下一个节点的关系
#链式存储队列类-队头删除,队尾加入,判断空满等
classLinkQueue01:"""头尾选择一端做队头,另一端队尾,队头删除,队尾插入,总有一端需要遍历
改进思路:标记头部和尾部,不需要遍历"""
def __init__(self):#标记头部位置
self._first =Node(None)#队头删除
defdequeue(self):
p=self._firstif p.next isNone:raise QueueError("queue is empty")else:
p.next=p.next.next#队尾插入
defenqueue(self, val):
p=self._firstif p.next isNone:
p.next=Node(val)else:while p.next is notNone:
p=p.next
p.next=Node(val)#判断队列为空
defis_empty(self):if self._first.next isNone:returnTrueelse:returnFalse#遍历队列
defshow(self):#队列为空时,报异常
if self._first.next isNone:raise QueueError("queue is empty")else:
p= self._first.next #第一个有限节点
while p is notNone: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.当队头和队尾重叠时,认为队列为空"""
classLinkQueue:def __init__(self):#定义队头队尾属性变量,牺牲节点,
self.front = self.rear =Node(None)#判断队列空
defis_empty(self):return self.front ==self.rear#入队操作,rear动
defenqueue(self,val):
self.rear.next=Node(val)
self.rear=self.rear.next#出队,front动,指向谁,谁出队
defdequeue(self):if self.front ==self.rear:raise QueueError("queue is empty")
self.front=self.front.nextreturn 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