队列的简单介绍以及python代码简单实现

队列

  • 特性: 先进先出
  • 应用: 多台计算机向一台打印机发送打印任务,打印机接收到的第一个进入的任务先完成,最后一个任务最后完成。

队列的简单介绍以及python代码简单实现_第1张图片

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

class Queue:

    def __init__(self):
        self.items = []  # 这里可以想象成列表的右侧是队首,左侧为队尾

    def enqueue(self, item):
        """ 将item添加到队尾 """
        self.items.insert(0, item)

    def dequeue(self):
        """ 从队首移除项并返回 """
        return self.items.pop()

    def is_empty(self):
        """ 判断队列是否为空 返回True|False """
        return self.items == []

    def size(self):
        """ 返回队列的长度 """
        return len(self.items)


queue = Queue()
alist = [1, 2, 3, 4, 5]
for a in alist:
    queue.enqueue(a)

for i in range(queue.size()):
    print(queue.dequeue())

两个小案例

  1. 案例一

    • """
      6个动物围成一个圈,排列顺序孩子们自己指定。第一个动物手里有一个烫手的山芋,需要在计时器计时1秒后将山芋传递给下一个孩子,依次类推。
      	规则是:在计时器每计时10秒时,手里有山芋的动物退出游戏。该游戏直到剩下一个动物时结束,最后剩下的动物获胜。
      	请使用队列实现该游戏策略,排在第几个位置最终会获胜。
      	
      分析:
      	假设下面是一个栈,左侧为队尾,右侧为队首,在队首第一个位置的动物就是拿着山芋的
      	一开始: [6, 5, 4, 3, 2, 1]
      	第一轮: [1, 6, 5, 4, 3, 2]   将队首动物拿出,然后添加从队尾添加
      	第二轮: [1, 2, 6, 5, 4, 3]
      	...
      	第十轮: 此时将在队首的动物淘汰
      """
      
      # 6个动物
      kids = ['A', 'B', 'C', 'D', 'E', 'F']
      
      # 将6个动物依次添加到队列中
      queue = Queue()
      for kid in kids:
          queue.enqueue(kid)
      
      while queue.size() > 1:
          """ 当队列长度大于1时,执行以下代码 """
          for i in range(9):
              """ 7秒淘汰一个,9秒内是不淘汰的 """
              kid = queue.dequeue()  # 将队首的动物拿出来
              queue.enqueue(kid)  # 将拿出来的动物放到队尾
      
          # 过完9秒,将此时在队首的动物淘汰
          queue.dequeue()
      
      print(queue.dequeue())  # 此时输出的是获胜者
      
  2. 案例2

    • """
      如何使用两个队列实现一个栈
      
      分析:
      	队列是先进先出,栈是先进后出,所以要实现先进后出,后进先出
      	先实例化两个队列
      	队列A有5个数据,队列B没有数据
      	将有数据的队列A,一直删除,将删除的数据添加到没数据的队列B中,直到有数据的队列还剩一个数据的时候,说明那个数据是最后进来的,再将其真正的删除掉
      	此时队列A是没数据的,队列B是有数据的,再将两个互换数据
      	然后依次进行,直到互换数据后,队列A没数据
      """
      
      q1 = Queue()  # 队列A
      q2 = Queue()  # 队列2
      
      alist = [1, 2, 3, 4, 5]
      for a in alist:
          q1.enqueue(a)  # 向队列A中添加数据
      
      while q1.size() > 0:
          """ 当q1没有数据时,循环结束 """
          while q1.size() > 1:
              """ 当队列A中数据数量大于1时 """
              item = q1.dequeue()  # q1删除数据
              q2.enqueue(item)  # q2接收数据
      
          print(q1.dequeue())  # 此时删除的数据是最后进来的,让它先出去
          q1, q2 = q2, q1  # q1, q2互换
          
      

你可能感兴趣的:(数据结构,python,开发语言)