1,队列的定义

  队列:是一种先进先出的数据结构,如下图所示,现进去的数据在队列前面(front),先出队列,后进入队列的数据在后面(rear),后出队列。

        

  队列常用操作:

q=Queue()      #创建队列
q.enqueue(item) # 数据入队列,在队列后面
q.dequeue() #数据出队列,从队列前面移出数据并返回
q.isEmpty() #返回队列是否为空
q.size() #返回队列大小

  操作示例:

        

2,用python实现队列

    可以用python的list来实现队列,其定义如下面代码所示。 (其中enqueue和dequeue也可以用append和pop(0)来实现)

class Queue(object):
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)

3,队列的应用

  3.1 约瑟夫环问题(Josephus problem):n个人围成一圈,从1开始报数,每当有人报到m时,他被淘汰,下一个人继续从1开始报数,问最后的获胜者是谁?

  Hot potato game:N个人编号1~N,围坐成一个圆圈。从1号人开始传递一个热土豆,经过M次传递后拿着热土豆的人被清除离座,由坐在后面的人拿起热土豆继续进行游戏。最后剩下的人获胜.
  上面两个问题相同,如果M=0和N=5,则游戏人依序被清除,5号游戏人获胜。如果M=1 和N=5,那么被清除的人的顺序是2,4,1,5,最后3号人获胜。

代码实现如下(n=5,m=7):

#n个人围成一圈,第一个人从1开始报数,每当有人报到m时,他被淘汰,下一个人继续从1开始报数
def josephus(people_list,num):
q = Queue()
for people in people_list:
q.enqueue(people) while q.size()>1:
for i in range(num-1):
q.enqueue(q.dequeue())
q.dequeue()
return q.dequeue()
people_list = [1,2,3,4,5]
print josephus(people_list,7)

(上述代码中people_list = [1,2,3,4,5],加入Queue中后q=[5,4,3,2,1],people_list的正序报数对应q中的倒序报数)

  3.2. 模拟打印机任务队列

    有这样一种情景:有一台打印机,其打印速度可以调节,每分钟打印5页,10页或15页,打印速度越快质量越差。平均每三分钟会有一个学生来打印,打印内容在20页以内,打印机的速度该设置为多少时,才能保证打印质量,同时减少学生的等待时间?

  模拟代码如下:

#模拟打印机任务队列
import random
class Printer(object):
def __init__(self,ppm):
self.printrate = ppm # ppm 每分钟打印多少页
self.currentTask = None
self.timeRemaining=0 def tick(self):
if self.currentTask!=None:
self.timeRemaining = self.timeRemaining-1
if self.timeRemaining<=0:
self.currentTask=None def busy(self):
if self.currentTask!=None:
return True
else:
return False def startTask(self, newTask):
self.currentTask=newTask
self.timeRemaining = newTask.getPages()*60/self.printrate class Task(object):
def __init__(self,time):
self.timestamp = time
self.pages = random.randrange(1,21) def getPages(self):
return self.pages def getStamp(self):
return self.timestamp def waitTime(self,currentTime):
return currentTime-self.timestamp def simulation(numSeconds,pagesPerMinute):
printer = Printer(pagesPerMinute)
printqueue = Queue()
waitingtime = []
for currentSecond in range(numSeconds):
if printTask():
task = Task(currentSecond)
printqueue.enqueue(task)
if (not printer.busy()) and (not printqueue.isEmpty()):
newTask = printqueue.dequeue()
waitingtime.append(newTask.waitTime(currentSecond))
printer.startTask(newTask)
printer.tick()
averageWait = sum(waitingtime)/len(waitingtime)
print "Average wait %6.2f seconds, %d tasks remaining"%(averageWait,printqueue.size()) #平均每三分钟有一个打印任务
def printTask():
num = random.randrange(1,181)
if num==180:
return True
else:
return False for i in range(10):
simulation(3600,10) # 模拟时间60分钟,打印机速度为10

  打印机速度为10,60分钟内模拟结果如下:(平均等待时间158-947秒,剩余2-10个打印任务)

    

参考:http://interactivepython.org/runestone/static/pythonds/BasicDS/WhatIsaQueue.html

数据结构之队列(Queue)的更多相关文章

  1. Python与数据结构[2] -> 队列/Queue[0] -> 数组队列的 Python 实现

    队列 / Queue 数组队列 数组队列是队列基于数组的一种实现,其实现类似于数组栈,是一种FIFO的线性数据结构. Queue: <--| 1 | 2 | 3 | 4 | 5 |<-- ...

  2. 数据结构:队列queue 函数push() pop size empty front back

    队列queue: push() pop() size() empty() front() back() push()  队列中由于是先进先出,push即在队尾插入一个元素,如:可以输出:Hello W ...

  3. 算法与数据结构基础 - 队列(Queue)

    队列基础 队列具有“先进先出”的特点,用这个特点我们可以用它来处理时间序列相关或先后次序相关的问题,例如 LeetCode题目 933. Number of Recent Calls,时间复杂度O(1 ...

  4. 数据结构之队列(queue)

    队列介绍 1.队列是一个有序列表,可以用数组或是链表来实现. 2.遵循先入先出的原则.即:先存入队列的数据,要先取出.后存入的要后取出. 应用场景 比如某某银行叫号系统: 数组模拟队列 队列本身是有序 ...

  5. 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  6. 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  7. 数据结构——链队列(linked queue)

    /* linkedQueue.c */ /* 链队列 */ #include <stdio.h> #include <stdlib.h> #include <stdboo ...

  8. python基本数据结构栈stack和队列queue

    1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...

  9. Java多线程总结之线程安全队列Queue

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非 ...

  10. Java中的队列Queue,优先级队列PriorityQueue

    队列Queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口. Queue使用时要尽量避免Collecti ...

随机推荐

  1. 基于SAML2.0的SAP云产品Identity Authentication过程介绍

    SAP官网的架构图 https://cloudplatform.sap.com/scenarios/usecases/authentication.html 上图介绍了用户访问SAP云平台时经历的Au ...

  2. 自己整理的的数据操作DbHelper

    using System.Data; using System.Data.SqlClient; using System.Configuration; namespace WindowsFormsAp ...

  3. Python3简易接口自动化测试框架设计与实现(中)

    目录 7.Excel数据读取 7.1.读取配置文件 7.1.编写Excel操作类 8.用例组装 9.用例运行结果校验 10.运行用例 11 .小结 上一篇:Python3简易接口自动化测试框架设计与实 ...

  4. Django单表查询及其方法

    单表查询 前期准备 首先新建一个test的python文件,然后再manage.py中导入main语句及其下面的复制到新文件中 并导入django 写上django.setup() 就可以导入对应的m ...

  5. asp.net 设计音乐网站

    第一步 收集资料 http://www.logoko.com.cn/    --设计logo网站 设计音乐文档  https://wenku.baidu.com/view/3d957617f18583 ...

  6. java——Servlet

    类要实现Servlet接口: 主要功能,生成动态网页内容: HttpServlet重写doGet和doPost方法或者重写Service方法,完成对请求的响应: 如:get.post等请求的响应. - ...

  7. 【Codeforces】Orz Panda Cup

    大大出的题 大大经常吐槽没有人补,所以我决定做一个 A. APA of Orz Pandas 题意:给你一个包含+-*/%和()的表达式,让你把它转化成java里BigInteger的形式 大概就像这 ...

  8. Mac&Appium&Python自动化测试-Appium安装

    基础配置 1.JAVA和Git就不用多说了 2.Brew,也就是homebrew,它是MacOSX上的软件包管理工具,它就等同于linux上的apt-get.yum,如果没有安装,可以通过如下命令安装 ...

  9. 二叉堆的介绍和Java实现

    一.堆和二叉堆 堆,英文名称Heap,所谓二叉堆(也有直接称二叉堆为堆的),本质上是一个完全二叉树,前面也提到过,如果树接近于完全二叉树或者满二叉树,采用顺序存储代价会小一点,因此常见的二叉堆均是顺序 ...

  10. SpringBoot + Maven + Hibernate ( 简单实现CRUD功能 )

    工具:idea.mariadb数据库 创建一个项目 ( student ) ........(使用idea创建一个springboot项目,这里我就不多说了) Maven 中的依赖 <?xml ...