Python数据结构应用2——Queue
队列 Queue 建立
class Queue:
def __init__(self):
self.items = []
def is_empty(self):
return self.items ==[]
# input在前,output在后
def enqueue(self, item):
self.items.insert(0,item)
def dequeue(self):
return self.items.pop()
def size(self):
return len(self.items)
def show(self):
return self.items
用stack在python中解决实际问题
击鼓传花(hot potato)
击鼓传花问题,使用queue进行一个循环,敲打的次数为num,当敲打完毕,quene尾的小朋友被剔除,queue中最后的人即为胜者。
每一次循环的过程为:queue尾的小朋友重制到queue前,即sim_queue.enqueue(sim_queue.dequeue())

def hot_potato(name_list, num):
sim_queue = Queue()
for name in name_list:
sim_queue.enqueue(name)
while sim_queue.size()>1:
for i in range(num):
sim_queue.enqueue(sim_queue.dequeue())
sim_queue.dequeue()
return sim_queue.dequeue()
print(hot_potato(["Bill", "David", "Susan", "Jane", "Kent",
"Brad"], 20))
Bill
打印机问题
学校的打印店是一个嘈杂的地方,有时一个打印机连着几台电脑,这个时候先按print的那一台在队列前面,这很好理解。 
实现这个算法需要建立两个class,分别是Printer & Task。
假设printer一分钟可以打印纸的张数为page_rate,每个task的纸张数只能为1-20之间。
具体步骤
- 创建一个task queue,每个task一旦入队给一个时间标签
- For every second:
- 检查是否新的task被创建了,如果是,将他放入task queue中,并将此时的时间作为时间标签
- 如果printer不busy且task正在等待
- dequeue下一个task且将其置入printer
- 用当前时间减去该task的时间戳,计算该task的等待时间
- 将这个task的等待时间放入list中
- 根据这个task的纸张数目,计算完成这个task需要的时间
- 一秒过去了~~~
- 如果这个task完成了,或者说需要的时间减少为0,那么printer也不在busy了
- 根据list中的时间计算平均等待时间
class Printer:
def __init__(self, ppm):
self.page_rate = ppm # pages per minute
self.current_task = None
self.time_remaining =0
def tick(self): # 1 second goes by
if self.current_task != None:
self.time_remaining = self.time_remaining-1
if self.time_remaining <=0:
self.current_task = None
def busy(self):
if self.current_task != None:
return True
else:
return False
def start_next(self, new_task):
self.current_task = new_task
self.time_remaining = new_task.get_pages() * 60 / self.page_rate
import random
class Task:
def __init__(self, time):
self.timestamp = time
self.pages = random.randrange(1,20) #每个task的pages随机产生
def get_stamp(self):
return self.timestamp
def get_pages(self):
return self.pages
def wait_time(self, current_time):
return current_time - self.timestamp
模拟过程
def simulation(num_seconds, ppm):
lab_printer = Printer(ppm)
print_queue = Queue()
waiting_times = []
for current_second in range(num_seconds):
if new_print_task(): # 每秒有1/180的概率产生一个新的task
task = Task(current_second)
print_queue.enqueue(task)
if (not lab_printer.busy()) and (not print_queue.is_empty()):
next_task = print_queue.dequeue()
waiting_times.append(next_task.wait_time(current_second))
lab_printer.start_next(next_task)
lab_printer.tick()
average_wait = sum(waiting_times)/len(waiting_times)
print("Average Wait %6.2f secs %3d tasks remaining."%(average_wait, print_queue.size()))
def new_print_task():
num = random.randrange(1, 181)
if num == 180:
return True
else:
return False
for i in range(10):
simulation(3600,5)
Average Wait 173.06 secs 2 tasks remaining.
Average Wait 102.06 secs 0 tasks remaining.
Average Wait 69.00 secs 1 tasks remaining.
Average Wait 191.58 secs 4 tasks remaining.
Average Wait 29.80 secs 0 tasks remaining.
Average Wait 136.38 secs 0 tasks remaining.
Average Wait 56.15 secs 0 tasks remaining.
Average Wait 160.18 secs 0 tasks remaining.
Average Wait 301.59 secs 4 tasks remaining.
Average Wait 107.88 secs 0 tasks remaining.
双端队列 deques
双端队列中的元素可以从两端弹出,插入和删除操作限定在队列的两边进行。
deques 建立
class Deque:
def __init__(self):
self.items = []
def is_empty(self):
return self.items == []
def add_front(self, item):
self.items.append(item)
def add_rear(self, item):
self.items.insert(0,item)
def remove_front(self):
return self.items.pop()
def remove_rear(self):
return self.items.pop(0)
def size(self):
return len(self.items)
由上述代码可以看出,从front端插入和删除的时间复杂度为O(1),从rear端插入和删除的操作的时间复杂度为O(n)
deque应用:回文检查
回文:一个string顺序读和倒序读是一样的,如radar
方法: 将string储存到deque中,提取the rear和the front,然后进行比较。
def pal_checker(a_string):
char_deque = Deque()
for ch in a_string:
char_deque.add_rear(ch)
still_equal = True
while char_deque.size()>1 and still_equal:
first = char_deque.remove_front()
last = char_deque.remove_rear()
if first != last:
still_equal = False
return still_equal
print(pal_checker("lsdkjfskf"))
print(pal_checker("radar"))
False
True
Python数据结构应用2——Queue的更多相关文章
- python 数据结构 队列(queue)
如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10293817.html 欢迎关注小婷儿的博客: 有问题请在博客下留言或加作者微信:t ...
- [Python数据结构] 使用 Circular List实现Queue
[Python数据结构] 使用 Circular List实现Queue 1. Queue队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体 ...
- python数据结构之栈与队列
python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...
- python并发编程之Queue线程、进程、协程通信(五)
单线程.多线程之间.进程之间.协程之间很多时候需要协同完成工作,这个时候它们需要进行通讯.或者说为了解耦,普遍采用Queue,生产消费模式. 系列文章 python并发编程之threading线程(一 ...
- Python - 数据结构 - 第十五天
Python 数据结构 本章节我们主要结合前面所学的知识点来介绍Python数据结构. 列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和 ...
- Python数据结构汇总
Python数据结构汇总 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.线性数据结构 1>.列表(List) 在内存空间中是连续地址,查询速度快,修改也快,但不利于频繁新 ...
- python数据结构之二叉树的统计与转换实例
python数据结构之二叉树的统计与转换实例 这篇文章主要介绍了python数据结构之二叉树的统计与转换实例,例如统计二叉树的叶子.分支节点,以及二叉树的左右两树互换等,需要的朋友可以参考下 一.获取 ...
- Python数据结构与算法之图的广度优先与深度优先搜索算法示例
本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...
- python数据结构之图深度优先和广度优先实例详解
本文实例讲述了python数据结构之图深度优先和广度优先用法.分享给大家供大家参考.具体如下: 首先有一个概念:回溯 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到 ...
随机推荐
- Android面试题摘录
本文中面试题全部选自<精通Android>(英文名“Pro android 4”)一书的章后面试题,不过这套面试题与书中内容结合比较紧密,所以选择使用时请谨慎. ####C2:Androi ...
- Ruby中如何复制对象 (deep clone)(转载)
Ruby中如何复制对象 (deep clone) 用Ruby复制一个对象(object)也许没有你想像的那么容易. 今天我google了半天, 做个总结吧. 先从最简单的开始, b = a 是复制吗? ...
- 二分查找算法的C++和PHP实现
C++实现方式: #include<iostream> #include<stdlib.h>#include<algorithm> using namespace ...
- RabbitMQ学习总结
关于RabbitMQ是什么以及它的概念,不了解的可以先查看一下下面推荐的几篇博客 https://blog.csdn.net/whoamiyang/article/details/54954780 h ...
- 物流的纯css实现方法
首先我们来看看UI给出的设计图. 为什么到达是最前面,为什么物流顺序是倒叙的,这是什么用户习惯,这是我拿到设计稿的问题,但是这里不谈设计,因为审美这个东西无法评估.那么这里我就做一个顺序的来对比一下吧 ...
- 判断某个方法是否存在,解析php函数function_exists (),method_exists()与is_callable()的区别
php函数function_exists (),method_exists() 与is_callable()的区别在哪? 先来讲下后两个:method_exists() 与is_callable(): ...
- Centos7下安装MySql
1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动MariaDB systemctl start maria ...
- java 一维数组
数组的概念?有什么特点? 数组是指一组数据的集合,数组中的每个数据被称作元素.在数组中可以存放任意类型的元素,但同一个数组里存放的元素类型必须一致. 一维数组的定义格式? 数据类型[] 名称 = ...
- Python_CRC32
#计算文件的CRC32值 import sys import zlib import os.path filename=sys.argv[1] print(filename) if os.path.i ...
- 1.Spring Framework 5.0 入门篇
1.为什么学习Spring? 随着对Java EE的不断接触和理解,你会发现Spring 在各个企业和项目中发挥着越来越重要的作用.掌握Spring 已成为我们IT行业生存必学的本领之一. Spri ...