Python与数据结构[2] -> 队列/Queue[0] -> 数组队列的 Python 实现
队列 / Queue
数组队列
数组队列是队列基于数组的一种实现,其实现类似于数组栈,是一种FIFO的线性数据结构。
Queue:
<--| 1 | 2 | 3 | 4 | 5 |<--
下面将使用Python中的list来替代C语言中的数组实现数组队列的数据结构。
Note: 这里的实现并没有像C语言中的申请一块固定大小的数组,手动的定制数组中队列的头尾位置,而是利用list的特性直接完成,因此较为简单。
数组队列的实现与数组栈的实现基本类似,同时入列和出列也十分简单,仅需要对数组进行操作即可。
这里直接给出完整代码和运行结果,实现过程可参考数组栈的实现。
后续再补充固定数组大小的队列实现。
完整代码
class QueueEmptyException(Exception): pass class QueueFullException(Exception): pass class Queue:
"""
Queue:
<--| 1 | 2 | 3 | 4 | 5 |<--
"""
def __init__(self, max=0):
self.queue = []
self._max = max
self.max = max def __str__(self):
return ' | '.join(map(str, self.queue)) def init(self, iterable=()):
if not iterable:
return
self.queue.extend(list(iterable)) @property
def max(self):
return self._max @max.setter
def max(self, m):
m = int(m)
if m < self.length:
raise Exception('Resize queue failed, please dequeue some elements first.')
self._max = m
if self._max < 0:
self._max = 0 def show(self):
print(self) @property
def length(self):
return len(self.queue) @property
def is_empty(self):
return not bool(self.queue) @property
def is_full(self):
return bool(self._max and self.length == self._max) def enqueue(self, item):
if self.is_full:
raise QueueFullException('Error: trying to enqueue element into a full queue')
self.queue.append(item) def dequeue(self):
if self.is_empty:
raise QueueEmptyException('Error: trying to dequeue element from an empty queue')
front = self.queue[0]
self.queue = self.queue[1:]
return front def clear(self):
self.queue = [] def test(queue):
print('\nInit queue:')
queue.init([1, 2, 3, 4, 5, 6, 7])
queue.show() print('\nEnqueue element to queue:')
queue.enqueue('like')
queue.show() print('\nDequeue element from queue:')
e = queue.dequeue()
print('Element %s deququed,' % e)
queue.show() print('\nSet queue max size:')
try:
queue.max = 1
except Exception as e:
print(e) print('\nSet queue max size:')
queue.max = 7
print(queue.max) print('\nEnqueue full queue:')
try:
queue.enqueue(7)
except QueueFullException as e:
print(e) print('\nClear queue:')
queue.clear()
queue.show() print('\nQueue is empty:')
print(queue.is_empty) print('\nDequeue empty queue:')
try:
queue.dequeue()
except QueueEmptyException as e:
print(e) if __name__ == '__main__':
test(Queue())
运行得到结果
Init queue:
1 | 2 | 3 | 4 | 5 | 6 | 7 Enqueue element to queue:
1 | 2 | 3 | 4 | 5 | 6 | 7 | like Dequeue element from queue:
Element 1 deququed,
2 | 3 | 4 | 5 | 6 | 7 | like Set queue max size:
Resize queue failed, please dequeue some elements first. Set queue max size:
7 Enqueue full queue:
Error: trying to enqueue element into a full queue Clear queue: Queue is empty:
True Dequeue empty queue:
Error: trying to dequeue element from an empty queue
相关阅读
1 数组栈
Python与数据结构[2] -> 队列/Queue[0] -> 数组队列的 Python 实现的更多相关文章
- Java中的队列Queue,优先级队列PriorityQueue
队列Queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口. Queue使用时要尽量避免Collecti ...
- 【栈和队列】5、队列概述与数组队列的基本实现 - Java
3-5 数组队列 简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 队列Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另 ...
- 映射Map、队列Queue、优先级队列PriorityQueue
映射Map 将对象映射到其他对象的能力是解决编程问题的有效方法.例如,考虑一个程序,它被用来检查 Java 的 Random 类的随机性.理想情况下, Random 会产生完美的数字分布,但为了测试这 ...
- java-Enumeration,单向队列Queue及双向队列Deque等容器简单使用
1.Enumeration容器使用: package com.etc; import java.util.Enumeration; import java.util.Vector; /* Enumer ...
- java队列Queue及阻塞队列
java队列 接口Queue类在java.util包,定义了以下6个方法 详细查看官方文档https://docs.oracle.com/javase/7/docs/api/java/util/Que ...
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
- Python与数据结构[4] -> 散列表[0] -> 散列表与散列函数的 Python 实现
散列表 / Hash Table 散列表与散列函数 散列表是一种将关键字映射到特定数组位置的一种数据结构,而将关键字映射到0至TableSize-1过程的函数,即为散列函数. Hash Table: ...
- Python生产者producer和consumer消费者案例写法,含有多线程,包含队列queue、JoinableQueue队列的用法
import timeimport random import queuefrom multiprocessing import Process,Queue 案例一:def consumer(q,na ...
- python队列queue 之优先级队列
import queue as Q def PriorityQueue_int(): que = Q.PriorityQueue() que.put(10) que.put(1) que.put(5) ...
随机推荐
- 《Cracking the Coding Interview》——第5章:位操作——题目4
2014-03-19 06:15 题目:解释(n & (n - 1)) == 0是什么意思? 解法:n&n-1是去掉最低位‘1’的方法.根据运算符优先级,貌似用不着加那个括号,但位运算 ...
- 【Hazard of Overfitting】林轩田机器学习基石
首先明确了什么是Overfitting 随后,用开车的例子给出了Overfitting的出现原因 出现原因有三个: (1)dvc太高,模型过于复杂(开车开太快) (2)data中噪声太大(路面太颠簸) ...
- python2.7写入文件时指定编码为utf-8
python3.0可以这样写 f = open('ufile.log', 'w', 'utf-8') 但在python2.7中open()没有编码参数,如上那样写会报错,可以使用如下模块 impo ...
- 孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录
孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...
- 计算机图形学 opengl版本 第三版------胡事民 第三章更多的绘图工具
opengl 计算机图形学 第三版 第二部分 第三章更多的绘图工具 3.1 概述 第2章中 我们绘图使用的是屏幕窗口的基础坐标系 以像素为单位 屏幕坐标从左下角x从0延伸到scr ...
- ctags+cscope替换sourceinsight
背景 windows环境开发+linux交叉编译的开发模式,代码阅读和编写都用的source-insight. 除了检索,跳转,工程构建等方面,sourceinsight自带了一些宏语言,可以轻松实现 ...
- [C++] 数据结构应用——链表
C++ 数据结构应用--链表 代码已经封装成class啦,方便使用. 头文件:Linklist.h #include <iostream> /*********************** ...
- 带外键Mysql
带外键的表格的查询 复制代码 //////////////////查询指定表外键约束 select a.name as 约束名, object_name(b.parent_object_id) as ...
- 团队项目-第三次scrum 会议
时间:10.25 时长:30分钟 地点:线上 工作情况 团队成员 已完成任务 待完成任务 解小锐 根据初步讨论结果编写初步的api文档 编写project和projectGenerator类 陈鑫 采 ...
- 安卓自动化robotium工具简单使用(二)
在学习安卓的这段时间里,刚好有个朋友有一个APP的应用需要开发. 我马上就动手开始做着试试,在完成开发的同时写了相应的自动化测试代码,使用的是robotium. 才接触安卓没几天,写的不太好,如果有好 ...