zoukankan      html  css  js  c++  java
  • 队列

    队列

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

  • 相关阅读:
    Centos7 安装redis及简单使用
    Python 网络编程之网络协议(未完待续)
    Docker 安装(centos7下)
    Centos7 下vmware NAT模式配置网络连接与DNS
    Docker 初识
    八月份第五周学习总结
    八月份第四周学习总结
    java 学生信息管理
    八月份第三周学习总结
    八月份第一周学习总结
  • 原文地址:https://www.cnblogs.com/zzsy/p/12682159.html
Copyright © 2011-2022 走看看