zoukankan      html  css  js  c++  java
  • 数据结构----队列Queue

    队列的概念与数据结构

      队列是项的有序结合,其中添加新项的一端称为队尾,移除项的一端称为队首。当一个元素从队尾进入队列时,一直向队首移动,直到它成为下一个需要移除的元素为止。最近添加的元素必须在队尾等待。集合中存活时间最长的元素在队首,这种排序成为 FIFO,先进先出,也被成为先到先得。  

    队列的抽象数据类型定义:队列的抽象数据类型应该由以下结构和操作定义。队列操作如下:
    • Queue() 创建一个空的新队列。 它不需要参数,并返回一个空队列。
    • enqueue(item) 将新项添加到队尾。 它需要 item 作为参数,并不返回任何内容。
    • dequeue() 从队首移除项。它不需要参数并返回 item。 队列被修改。
    • isEmpty() 查看队列是否为空。它不需要参数,并返回布尔值。
    • size() 返回队列中的项数。它不需要参数,并返回一个整数。

    队列的定义  

      

     1 class Queue(object):
     2     def __init__(self):
     3         self.queue = []
     4 
     5     def __str__(self):
     6         return str(self.queue)
     7 
     8     def enqueue(self, item):
     9         self.queue.insert(0, item)
    10 
    11     def dequeue(self):
    12         return self.queue.pop() if self.queue else "Queue is empty!"
    13 
    14     def isEmpty(self):
    15         return self.queue == []
    16 
    17     def size(self):
    18         return len(self.queue)

     队列的应用案例-烫手的山芋

      烫手山芋游戏介绍:6个孩子围城一个圈,排列顺序孩子们自己指定。第一个孩子手里有一个烫手的山芋,需要在计时器计时1秒后将山芋传递给下一个孩子,依次类推。规则是,在计时器每计时7秒时,手里有山芋的孩子退出游戏。该游戏直到剩下一个孩子时结束,最后剩下的孩子获胜。请使用队列实现该游戏策略,排在第几个位置最终会获胜。

      - 这个游戏相当于著名的约瑟夫问题,一个一世纪著名历史学家弗拉维奥·约瑟夫斯的传奇故事。故事讲的是,他和他的 39 个战友被罗马军队包围在洞中。他们决定宁愿死,也不成为罗马人的奴隶。他们围成一个圈,其中一人被指定为第一个人,顺时针报数到第七人,就将他杀死。约瑟夫斯是一个成功的数学家,他立即想出了应该坐到哪才能成为最后一人。

     1 from basic.queue import Queue
     2 
     3 def hotPotato(namelist, num):
     4     simqueue = Queue()
     5     for name in namelist:
     6         simqueue.enqueue(name)
     7 
     8     while simqueue.size() > 1:
     9         for i in range(num):
    10             kid = simqueue.dequeue()
    11             simqueue.enqueue(kid)
    12 
    13         simqueue.dequeue()
    14 
    15     return simqueue.dequeue()
    16 
    17 print(hotPotato(["Bill","David","Susan","Jane","Kent","Brad"],7))
    队列解决烫手山芋问题
    
    
  • 相关阅读:
    完整的网站开发技术学习建议
    在微信小程序中绘制图表(part2)
    原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
    第八届蓝桥杯第二题:等差素数列
    第七届蓝桥杯第四题:快速排序
    51Nod:1086背包问题 V2
    POJ:2386 Lake Counting(dfs)
    51Nod:1268 和为K的组合
    迭代器
    51Nod:1134 最长递增子序列
  • 原文地址:https://www.cnblogs.com/open-yang/p/11366991.html
Copyright © 2011-2022 走看看