- 什么是队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列在设计程序中用的非常频繁。比如用键盘进行各种字母或数字的输入,到显示器如记事本软件上的输出,打印时各种任务之间的排列关系,其实就是对列的典型应用。
- 如何在python中实现队列及其基本操作?
from pythonds.basic.queue import Queue
#队列的例子:打印任务;键盘缓冲,先进先出,只可以从首端移除,尾端插入。
#队列特有的函数:isEmpty、enqueue、size、enqueue、dequeue
#Python实现
'''
class Queue:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items ==[]
def enqueue(self,item):
self.item.insert(0,item)
def dequeue(self):
return self.items.pop()
def size(self):
return len(self.items)
- 几个队列应用的小例子
3.1 击鼓传花问题:
问题背景:其实也就是约瑟夫环问题,一定数量的人坐成一个环,指定一个数字,从其中一个人开始报数,如果某个人报到改数字,则淘汰出局。在用队列解决该问题是,十分简单。首先创建一个队列,从队尾开始入队列,
# 队列的应用:热土豆
#击鼓传花的土豆版本、也就是约瑟夫环的问题
from pythonds.basic.queue import Queue
def hotpotato(namelist, num):
simqueue = Queue()
for name in namelist:
simqueue.enqueue(name)
while simqueue.size() > 1:
for i in range(num):
simqueue.enqueue(simqueue.dequeue())
simqueue.dequeue()
return simqueue.dequeue()
print(hotpotato(["xiao","xiang","han","baby","dequ","lala"],3))
3.2 打印机任务模拟过程
#打印任务,随机模拟的一个方法,通过程序模拟打印场景,支持对打印机模式设定的决策
#应该是线程的排列,但是目前无法实现
#1. 打印任务:提交时间、打印页数
#2.打印队列属性:具有FIFO的队列
#3.打印机的属性
#1.创建打印队列对象/按秒单位流失/时间用尽,开始统计平均等待时间
from pythonds.basic.queue import Queue
import random
class Printer:
def __init__(self,ppm):
self.pagerate = ppm #打印速度
self.currentTask = None #打印任务
self.timeRemaining = 0 #任务倒计时
#打印1秒
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 startNext(self,newtask):
self.currentTask = newtask
self.timeRemaining = newtask.getPages()*60/self.pagerate
class Task:
def __init__(self,time):
self.timestamp = time
self.pages = random.randrange(1,21)
def getStamp(self):
return self.timestamp
def getPages(selfself):
return self.pages
def waitTime(self,currenttime):
return currenttime - self.timestamp
def newPrintTask():
num = random.randrange(1,181)
if num == 180:
return True
else:
return False
def simulation(numSeconds, pagesPerMinute):
labprinter = Printer(pagesPerMinute)
printQueue = Queue()
waitingtimes = []
for currentSecond in range(numSeconds):
if newPrintTask():
task = Task(currentSecond)
printQueue.enqueue(task)
if(not labprinter.busy()) and(not printQueue.isEmpty()):
nexttask = printQueue.dequeue()
waitingtimes.append( nexttask.waitTime(currentSecond))
labprinter.startNext(nexttask)
labprinter.tick()
averageWait = sum(waitingtimes)/len(waitingtimes)
print("Average wait %6.2f secs %3d tasks remaining." \
%(averageWait,printQueue.size()))
for i in range(10):
simulation(3600,3)
'''
3.3 双端队列
# 双端队列的相关函数
#1.Deque(),创建一个空双端队列,addFront(item)将item加入队首
#addRear(item),将item加入队尾
#removeFront/ RemoveRear/ isEmpty/size
#回文词的判定
from pythonds.basic.deque import Deque
def palchecker(aString):
chardeque = Deque()
for ch in aString:
chardeque.addRear(ch)
stillEqual = True
while chardeque.size() >1 and stillEqual:
first = chardeque.removeFront()
last = chardeque.removeRear()
if first != last:
stillEqual = False
return stillEqual
print(palchecker("asdfgfdsa"))
print(palchecker("radat"))
4.总结
队列这种数据结构相对实现比较简单,对字符串操作应该会比较便利,希望该博文对你的学习有帮助。