python 实现队列

本文深入探讨了队列的基本概念及其在Python中的具体实现,包括队列的创建、添加、删除元素等基本操作,同时提供了详细的代码示例。此外,还介绍了如何使用Python内置库实现队列,以及队列在解决经典约瑟夫问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 队列的概念

   队列被构造为在队尾添加项的有序集合,并且从队首移除。队列保持 FIFO 排序属性。 队列操作如下。

  • Queue() 创建一个空的新队列。 它不需要参数,并返回一个空队列。
  • enqueue(item) 将新项添加到队尾。 它需要 item 作为参数,并不返回任何内容。
  • dequeue() 从队首移除项。它不需要参数并返回 item。 队列被修改。
  • isEmpty() 查看队列是否为空。它不需要参数,并返回布尔值。
  • size() 返回队列中的项数。它不需要参数,并返回一个整数。

二、 python实现

class MyQueue(object):
    def __init__(self):
        self.data = []

    def enqueue(self, val):
        self.data.insert(0, val)

    def dequeue(self):
        if self.is_empty():
            raise ValueError('Queue is empty')
        return self.data.pop()

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

    def empty(self):
        self.data = []
    
    def is_empty(self):
        return True if len(self.data) else False

    def __str__(self):
        return str(self.data)

三、运行效果

>>> from math_use import MyQueue
>>> q = MyQueue()
>>> q.enqueue(4)
>>> q
<math_use.MyQueue object at 0x10e34d710>
>>> print(q)
[4]
>>> q.enqueue('work')
>>> q.enqueue(True)
>>> print(q)
[True, 'work', 4]
>>> q.dequeue()
>>> print(q)
[True, 'work']
>>> q.size()
2
>>> q.empty(
... )
False
>>> 

四、 python内部库直接导入队列

    1、安装model pythonds

        pip install pythonds
    2、导入Queue

        from pythonds.basic import Queue

五、使用队列解决约瑟夫问题

       约瑟夫问题:据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

def josephus():
    a = [x for x in range(1, 42)]  # 生成编号1-41的41个人
    a_q = MyQueue()
    for p in a:
        a_q.enqueue(p)
    while a_q.size() > 2:
        for i in range(2):
            del_p = a_q.dequeue()
            a_q.enqueue(del_p)
        a_q.dequeue()
    return a_q

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值