队列

队列

  • 队列:先进先出
  • 应用场景:
    • 我们的计算机实验室有 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
    

原文地址:https://www.cnblogs.com/zzsy/p/12682159.html