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. asp.net mvc4 学习1

    1 简介:微软在很早就看到了基于windows系统的web开发平台的需求,这时便开始提出自己的解决方案即微软的第一个基于web开发的平台ASP.再后来随着需求和性能的要求再2002年推出第二个解决方案 ...

  2. host缓存,浏览器缓存---解决host缓存带来的伤

    1.缓存 缓存,对应工程师来讲简直太熟悉了,太方便了,省略到资源或数据的获取方式,直接缓存到离用户访问最快的地方,也降低服务器的压力,比如: (1)静态文件获取 服务器->cdn->本地磁 ...

  3. 2.3 使用 dom4j 对 xml文件进行 dom 解析

    // 使用dom4j对XML文档进行解析 CRUD public class Demo1 { //读取XML文档中第二本书的书名 <书名>javaWEB</书名> @Test ...

  4. Spark集群任务提交流程----2.1.0源码解析

    Spark的应用程序是通过spark-submit提交到Spark集群上运行的,那么spark-submit到底提交了什么,集群是怎样调度运行的,下面一一详解. 0. spark-submit提交任务 ...

  5. XXX_initcall()函数分析

    1. 先看这些宏的定义(定义在文件include/linux/init.h中) #define pure_initcall(fn) __define_initcall("0",fn ...

  6. shell 中的通配符:

    shell 中的通配符: *: 代表 0 个或者多个任意字符 ?: 代表一定有一个的任意字符 []: 代表一定有一个在括号内的字符(非任意字符).例如[abcd]代表一定有一个字符,可能是 abcd ...

  7. tnsnames.ora配置细节注意

    WXPT = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.250)(PORT = 1521) ...

  8. okhttp任务调度核心类dispatcher解析

    在之前已经对okhttp的同步和异步请求的流程进行了详细的分析,其中任务调度是由dispatcher来实现的,非常重要,所以这次专门来对它进行一个了解,带着问题去进行探究: Q1:okhttp如何实现 ...

  9. bat 读取 ini 配置文件

    bat 读取 ini 配置文件 config.ini: abc=abc a=a localpath=D:\local\path .bat: @echo off setlocal enabledelay ...

  10. 【bfs分层图 dp】hihocoder#1147 : 时空阵

    最短路径树上分层dp的一类套路吧 题目大意 幽香这几天学习了魔法,准备建造一个大型的时空传送阵. 幽香现在可以在幻想乡的n个地点建造一些传送门,如果她建造了从地点a与地点b之间的传送门,那么从a到b和 ...