数据结构与算法Python版 队列


一、队列

队列列Queue是一种有次序的数据集合,其特征是

  • 新数据项的添加总发生在一端(通常称为“尾rear”端),而现存数据项的移除总发生在另一端(通常称为“首front”端)
  • 当数据项加入队列,首先出现在队尾,随着队首数据项的移除,它逐渐接近队首。
  • 新加入的数据项必须在数据集末尾等待,而等待时间最长的数据项则是队首。这种次序安排的原则称为(FIFO:First-in first-out)先进先出,或“先到先服务first-come first-served”
  • 队列仅有一个入口和一个出口不允许数据项直接插入队中,也不允许从中间移除数据项
    在这里插入图片描述

队列的例子:排队,打印队列,进程调度,键盘缓冲
在这里插入图片描述

抽象数据类型Queue

方法名 描述 返回值
Queue() 创建一个空队列对象 Queue对象
enqueue(item) 将数据项item添加到队尾 无返回值
dequeue() 从队首移除数据项,队列被修改 队首数据项
isEmpty() 测试是否为空队列 布尔值
size() 返回队列中数据项的个数 数据项个数(整数)

Python实现ADT Queue

  • 队首是列表的末端;队尾是列表的首端。也可以倒过来。
class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item):
        self.items.insert(0, item)

    def dequeue(self):
        return self.items.pop()

    def is_empty(self):
        return len(self.items) == 0

    def size(self):
        return len(self.items)

二、队列的应用-约瑟夫问题

约瑟夫问题

  • 传说犹太人反叛罗马人,落到困境,约瑟夫和39人决定坐成一圈儿,报数1~7,报到7的人淘汰,结果约瑟夫给自己安排了个位置,最后活了下来……
  • 我们用传递热土豆来模拟
    • 模拟程序采用队列来存放所有参加游戏的人名,游戏时,队首始终是持有土豆的人
    • 模拟游戏开始,只需要将队首的人出队,随即再到队尾入队,算是土豆的一次传递
    • 土豆每传递7次,将队首的人移除,不再入队如此反复,直到队列中剩余1人
def josephus(name_list, num):
    # 在name_list人中,每数到num的人就会被淘汰
    q = Queue()
    for i in name_list:
        q.enqueue(i)

    while q.size
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值