"""
链式存储-队列
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

最新文章

  1. Android 通过 Intent 传递类对象或list对象
  2. rabbitmq使用
  3. spring注解 构造函数问题
  4. min_free_kbytes
  5. oc-28-构造函数
  6. C#WinForm中显示实时时间:年/月/日 时/分/秒 星期X
  7. phonegap 安装和使用eclipse
  8. Qt编程之对QGraphicsItem点击右键弹出菜单
  9. JavaScript加减计算方法和显示千分位
  10. MaterialDrawer开源侧滑菜单的使用手册
  11. CSS3笔记之第三天
  12. [Swift]LeetCode806. 写字符串需要的行数 | Number of Lines To Write String
  13. SecureCRT 5.2.2版本下载和注册码
  14. Python线程的用法 函数式线程_thread和threading 样例
  15. oneNote2016代码高亮插件
  16. hihocoder 1343 : Stable Members【拓扑排序】
  17. vue 路由参数变化,页面不更新的问题
  18. ubuntu下nginx的常用操作
  19. php错误日志
  20. fzu2157(树形dp)

热门文章

  1. ui自动化---select标签和浏览器等待
  2. Playbook使用,编写YAML
  3. oracle之二实例与数据库
  4. 第17课 - make 中的路径搜索(上)
  5. [leetCode]5. 最长回文子串(DP)
  6. MySQL的事务机制和锁(InnoDB引擎、MVCC多版本并发控制技术)
  7. goto 语法在 PHP 中的使用
  8. Java 15 正式发布, 14 个新特性,刷新你的认知!!
  9. JVM-STW-stop the world
  10. 2020 计蒜之道 预赛 第三场 石子游戏(简单)(暴力DP)