zoukankan      html  css  js  c++  java
  • 队列与双向队列

    队列类

     1 # python
     2 # -*- coding: utf-8 -*-
     3 """
     4 __title__ = ''
     5 __author__ = 'wlc'
     6 __mtime__ = '2017/10/13'
     7 """
     8 class pythonQueue:
     9     def __init__(self):
    10         self.items = []
    11     #isEmpty
    12     def isEmpty(self):
    13         return self.items == []
    14     #enqueue
    15     def enqueue(self, element):
    16         self.items.insert(0, element)
    17     #dequeue
    18     def dequeue(self):
    19         return self.items.pop()
    20     #queue size
    21     def size(self):
    22         return len(self.items)

    双向队列类

     1 # python
     2 # -*- coding: utf-8 -*-
     3 """
     4 __title__ = ''
     5 __author__ = 'wlc'
     6 __mtime__ = '2017/10/13'
     7 """
     8 class pythonDeque:
     9     def __init__(self):
    10         self.items = []
    11     #isEmpty
    12     def isEmpty(self):
    13         return self.items == []
    14     #size
    15     def size(self):
    16         return len(self.items)
    17     #addFront
    18     def addFront(self, item):
    19         self.items.append(item)
    20     #addRear
    21     def addRear(self, item):
    22         self.items.insert(0, item)
    23     #removeFront
    24     def removeFront(self):
    25         return self.items.pop()
    26     #removeRear
    27     def removeRear(self):
    28         return self.items.pop(0)

    使用队列模拟打印机类

     1 # python
     2 # -*- coding: utf-8 -*-
     3 """
     4 __title__ = ''
     5 __author__ = 'wlc'
     6 __mtime__ = '2017/10/13'
     7 """
     8 class pythonPrinter:
     9     def __init__(self, ppm):
    10         self.pageRate = ppm
    11         self.currentTask = None
    12         self.timeRemaining = 0
    13     #计时器
    14     def tick(self):
    15         if self.currentTask != None:
    16             self.timeRemaining = self.timeRemaining - 1
    17             if self.timeRemaining <= 0:
    18                 self.currentTask = None
    19     #是否忙
    20     def busy(self):
    21         if self.currentTask == None:
    22             return False
    23         else:
    24             return True
    25 
    26     #开始下一个任务
    27     def startNextTask(self, task):
    28         """
    29         :param task: 此处task是一个pythonPrinterTask对象
    30         """
    31         self.currentTask = task
    32         self.timeRemaining = task.getPage() * 60 / self.pageRate

    打印机任务类

     1 # python
     2 # -*- coding: utf-8 -*-
     3 """
     4 __title__ = ''
     5 __author__ = 'wlc'
     6 __mtime__ = '2017/10/13'
     7 """
     8 import random
     9 class pythonPrinterTask:
    10     def __init__(self, timeStamp):
    11         #当前的时间戳
    12         self.timeStamp = timeStamp
    13         #假设打印页数在1-20之间
    14         self.page = random.randrange(1,21)
    15     #得到时间戳
    16     def getStamp(self):
    17         return self.timeStamp
    18     #得到打印页数
    19     def getPage(self):
    20         return self.page
    21     #计算等待时间
    22     def waitTime(self, currentTime):
    23         return currentTime - self.timeStamp

    相关算法实现

      1 # python3
      2 # -*- coding: utf-8 -*-
      3 """
      4 __title__ = ''
      5 __author__ = 'wlc'
      6 __mtime__ = '2017/10/13'
      7 """
      8 from dataStructure.dS import pythonQueue
      9 from dataStructure.dS import  pythonPrinter
     10 from dataStructure.dS import  pythonPrinterTask
     11 from dataStructure.dS import  pythonDeque
     12 import random
     13 
     14 def hotPotato(nameList, num):
     15     """
     16     :program:烫手山芋问题 约瑟夫环
     17     :param nameList:
     18     :param num:
     19     :return: 最后一个人
     20     """
     21     #实例化一个队列
     22     queue = pythonQueue.pythonQueue()
     23     #将名字依次放入队列
     24     for list in nameList:
     25         queue.enqueue(list)
     26     #直到队列size为1 之前依次执行队列首出队列并且进入队尾
     27     while queue.size() > 1:
     28         for i in range(num):
     29             queue.enqueue(queue.dequeue())
     30         queue.dequeue()
     31     return queue.dequeue()
     32 ##################################################################################
     33 
     34 def printerTask(numSeconds, pageRate):
     35     """
     36     :program:模拟打印机排队过程
     37     :param numSeconds: 模拟时间长度单位秒
     38     :param pageRate: 打印机每分钟处理页数
     39     :return: 队列的平均等待时间
     40     """
     41     #实例化打印对象
     42     printer = pythonPrinter.pythonPrinter(pageRate)
     43     #list 用于保存task 等待时间
     44     waitList = []
     45     #实例化一个队列用于保存task队列
     46     tasksQueue = pythonQueue.pythonQueue()
     47 
     48     #模拟给定时间段的秒数
     49     for currentSecond in range(numSeconds):
     50         #随机生成一个任务3600秒内 假设一共有20个任务平均下来大约180秒产生一个新的任务
     51         if newTask():
     52             #如果是一个新的任务则将其实例化并且添加到队列中
     53             taskNew = pythonPrinterTask.pythonPrinterTask(currentSecond)
     54             tasksQueue.enqueue(taskNew)
     55         #如果打印机不忙并且打印队列不是空的 就将队列的队首给打印机 并且将该队首的等待时间计算出来放到waitList列表中
     56         if (not printer.busy()) and (not tasksQueue.isEmpty()):
     57             #取出队首
     58             taskQueue = tasksQueue.dequeue()
     59             #将等待时间放到list里边保存
     60             waitList.append(taskQueue.waitTime(currentSecond))
     61             #打印机开始下一个任务
     62             printer.startNextTask(taskQueue)
     63         #打印机开始一张一张的减去
     64         printer.tick()
     65     average = sum(waitList) / len(waitList)
     66     print("平均等待时间%6.2f %3d 任务正在等待" %(average, int(tasksQueue.size())))
     67 
     68 def newTask():
     69     """
     70     #program:随机产生1-180的数字 用于模拟在180秒内平均会有一次打印任务
     71     :return: True False
     72     """
     73     var = random.randrange(1, 181)
     74     if var == 180:
     75         return True
     76     else:
     77         return False
     78 
     79 ##################################################################################
     80 def palChecker(str):
     81     """
     82     program:回文检测 boob
     83     :param str: 输入字符串
     84     :return: true false
     85     """
     86     #实例化一个双向队列
     87     palDeque = pythonDeque.pythonDeque()
     88     #str 的每一个字符从尾部(index为0的位置)依次保存到双向队列中
     89     for str0 in str:
     90         palDeque.addRear(str0)
     91     #定义一个flag 若为false则返回
     92     flag = True
     93     #直到双向队列的大小>1 等于一意味着字符数为奇数 等于零 意味为偶数
     94     while palDeque.size() > 1 and flag:
     95         front = palDeque.removeFront()
     96         rear = palDeque.removeRear()
     97         if front != rear:
     98             flag = False
     99     return  flag
    100 
    101 
    102 
    103 if __name__ == '__main__':
    104     queue = pythonQueue.pythonQueue()
    105     print(queue.isEmpty())
    106     queue.enqueue('dog')
    107     print(queue.size())
    108     print(queue.items)
    109     pop = queue.dequeue()
    110     print(pop)
    111     print(queue.isEmpty())
    112     ###################################################################
    113     var = input("请输入排队列表以空格分隔:")
    114     var = [str for str in var.split()]
    115     var1 = input("请输入规则num:")
    116     result = hotPotato(var, int(var1))
    117     print("最后一个人是:%s" %result)
    118     ###################################################################
    119     var = int(input("请输入时间(单位秒):"))
    120     var1 = int(input("打印机处理速率(页/分钟):"))
    121     printerTask(var, var1)
    122     for i in range(10):
    123         printerTask(var, var1)
    124     ###################################################################
    125     var = input("请输入要检测回文的字符串:")
    126     print("检测结果:"+str(palChecker(var)))
  • 相关阅读:
    Kubernetes 学习15 kubernetes 认证及serviceaccount
    Kubernetes 学习14 kubernetes statefulset
    Kubernetes 学习13 kubernetes pv pvc configmap 和secret
    Day_13【IO流】扩展案例2_统计指定项目文件中字符出现的次数
    Day_13【IO流】扩展案例1_读取项目文件内容并去重
    Day_12【集合】扩展案例4_判断字符串每一个字符出现的次数
    Day_12【集合】扩展案例3_产生10个长度为10,不能重复,由数字0-9,小写字母和大写字母组成的字符串
    Day_12【集合】扩展案例2_键盘录入一个字符串,对其进行去重,并将去重后的字符串组成新数组
    Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序
    Day_11【集合】扩展案例5_对list集合对象中的元素进行反转,求最大值最小值,求元素i在list集合中首次出现的索引,将oldvalue替换为newvalue
  • 原文地址:https://www.cnblogs.com/wlc297984368/p/7661559.html
Copyright © 2011-2022 走看看