Python数据结构之---队列

  1. 什么是队列
    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列在设计程序中用的非常频繁。比如用键盘进行各种字母或数字的输入,到显示器如记事本软件上的输出,打印时各种任务之间的排列关系,其实就是对列的典型应用。
    在这里插入图片描述
  2. 如何在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)
  1. 几个队列应用的小例子
    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.总结
队列这种数据结构相对实现比较简单,对字符串操作应该会比较便利,希望该博文对你的学习有帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值