队列
队列
- 队列:先进先出
- 应用场景:
- 我们的计算机实验室有 30 台计算机与一台打印机联网。当学生想要打印时,他们的打印任务与正在等待的所有其他打印任务“一致”。第一个进入的任务是先完成。如果你是最后一个,你必须等待你前面的所有其他任务打印
- Queue() 创建一个空的新队列。 它不需要参数,并返回一个空队列。
- enqueue(item) 将新项添加到队尾。 它需要 item 作为参数,并不返回任何内容。
- dequeue() 从队首移除项。它不需要参数并返回 item。 队列被修改。
- isEmpty() 查看队列是否为空。它不需要参数,并返回布尔值。
- size() 返回队列中的项数。它不需要参数,并返回一个整数。
class Queue():
def __init__(self):
self.items = []
def enqueue(self,item):
self.items.insert(0,item)
def dequeue(self):
return self.items.pop()
def isEmpty(self):
return self.items == []
def size(self):
return len(self.items)
#q = Queue()
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
1
2
3
-
案例:烫手的山芋
- 烫手山芋游戏介绍:6个孩子围城一个圈,排列顺序孩子们自己指定。第一个孩子手里有一个烫手的山芋,需要在计时器计时1秒后将山芋传递给下一个孩子,依次类推。规则是,在计时器每计时7秒时,手里有山芋的孩子退出游戏。该游戏直到剩下一个孩子时结束,最后剩下的孩子获胜。请使用队列实现该游戏策略,排在第几个位置最终会获胜。
-
分析:
- 在一轮游戏中山芋会被传递6次
- 山芋传递的次数不受孩子个数的影响
- 山芋传递六次后一轮游戏结束,淘汰一个孩子游戏继续
- 队列:先进先出,只可以从对头取元素,从队尾添加元素。
- 准则:保证队头孩子手里面有山芋(谁手里有山芋谁作为队头)
- 方便删除元素。最终7秒到的时候需要将手里有山芋的孩子从队列中剔除。
kids = ['A','B','C','D','E','F']
queue = Queue()
#将6个孩子添加到了队列中
for kid in kids:
queue.enqueue(kid)
while queue.size() > 1:
#游戏开始,开始传递山芋
#山芋传递的次数
for i in range(6):
#让队头的孩子出队列在入队列
kid = queue.dequeue()
queue.enqueue(kid)
#当6次循环结束后,说明山芋被传递了6次,说明一轮游戏结束
#一轮游戏结束后,将对头孩子淘汰即可
queue.dequeue()
#当while循环结束后,游戏结束,队列中仅剩的孩子就是获胜者
print('获胜者:',queue.dequeue())
获胜者: E
山芋游戏图解
栈跟队列用列表形式表示
使用两个队列实现一个栈
class Queue():
def __init__(self):
self.items = []
def enqueue(self,item):
self.items.insert(0,item)
def dequeue(self):
return self.items.pop()
def isEmpty(self):
return self.items == []
def size(self):
return len(self.items)
q = Queue()
q1 = Queue()
##2个队列实现一个栈
思想:每次都取出,只留一个,取出来的放入第二个队列。然后再把第一个队列的元素取出。然后将两个队列互换。循环继续取所有留一个,取出来再放入交换的队列中,然后就把留下的一个取出,这是第二元素了,依次循环直到q.size没有元素
items =[1,2,3,4,5]
for i in items:
q.enqueue(i)
while True:
while q.size > 1:
item = q.dequeue()
q1.enqueue(item)
print(q.dequeue)
q,q1 =q1,q
if q.size == 0:
break