数据结构与算法(python) 线性结构:队列Queue

参考自 MOOC数据结构与算法Python版

一、什么是队列Queue

  • 队列是一种有次序的数据集合,其特征是:
    – 新数据项的添加总发生在一端("尾rear"端)
    – 而现存数据项的一处总发生在另一端(“首front”端)
  • 遵循先进先出(FIFO:First-infirst-out)
  • 队列的例子:排队,不允许数据项直接插入队中,也不允许从中间移除数据项
  • 计算机科学中队列的例子:打印队列
    在这里插入图片描述

二、抽象数据类型Queue

2.1 Queue的基本操作
函数含义
Queue()创建一个空队列对象,返回值为Queue对象
enqueue(item)将item添加到队尾(最左边),无返回值
dequeue()从队首移除数据项,返回值为队首数据项,队列被修改
isEmpty()返回是否为空队列,返回值为布尔值
size()返回队列中有多少个数据项
2.2 Python实现ADT Queue

采用List来容纳Queue的数据项,将List首端作为队列尾端,List的末端作为队列首端,enqueue()复杂度为O(n),dequeue()复杂度为O(1)

class Queue:
    def __init__(self):
        self.items = []
    def isEmpty(self):
        return self.items == []
    def enqueue(self, item):
        self.items.insert(0,item)
    def dequeue(self):
        return self.items.pop()
    def size(self):
        return len(self.items)

三、队列的应用

3.1 约瑟夫问题

传说犹太人反叛罗马人,落到困境,约瑟夫和39人决定殉难,坐成一圈儿,报数1~7,报到7的人由旁边杀死,结果约瑟夫给自己安排了个位置,最后活了下来……
在这里插入图片描述
算法流程:

  • 采用队列来存放所有参加游戏的人名,按照数字传递方向从队首排到队尾
  • 模拟游戏开始,每一次传递, 将队首的人移到队尾,达到num次后,将队首的人移除,剩下的人继续轮回

代码如下:

class Queue:
    def __init__(self):
        self.items = []
    def isEmpty(self):
        return self.items == []
    def enqueue(self, item):
        self.items.insert(0,item)
    def dequeue(self):
        return self.items.pop()
    def size(self):
        return len(self.items)
    
def Joseph(namelist, num):
    liveQueue = Queue()
    for name in namelist:
        liveQueue.enqueue(name)
    while liveQueue.size()>1:
        for i in range(num):
            liveQueue.enqueue(liveQueue.dequeue())
        liveQueue.dequeue()       
    return liveQueue.dequeue()
print(Joseph(["Justin Bieber","Eason","Leslie","Bille Eilish","Taylor Swift","Sia","Lana Del Rey","Troye Sivan"],4))    

试着跑跑程序哈~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值