一、 队列的概念
队列被构造为在队尾添加项的有序集合,并且从队首移除。队列保持 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