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) ...
随机推荐
- USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】
holstein解题报告 --------------------------------------------------------------------------------------- ...
- WPF and Silverlight.ComboBox 如何通过 Binding IsDropDownOpen 实现下拉菜单展开
In the WPF example the Popup and the ToggleButton (the arrow on the right) are bound with the proper ...
- ADB命令总结(1)
今日继续学习ADB,使用真机来操作,因此把所用到的命令总结如下: 一,模拟按HOME键 adb shell input keyevent KEYCODE_HOME 二,滑动手机屏幕 从(x1,y1)滑 ...
- pytest单元测试框架
一.安装方式 1.安装命令:pip install pytest 2.html安装插件:pip install pytest -html 二.pytest执行指定测试用例 1.思想:通过对测试用例进行 ...
- echarts 柱状图下钻功能
var drillDown = { getOption : function () { var option = null; option = { title: { text: ' ...
- 【志银】#define lowbit(x) ((x)&(-x))原理详解
分析下列语句 #define lowbit(x) ((x)&(-x)) 可写成下列形式: int Lowbit(x) { return x&(-x); } 例1:x = 1 十进制转二 ...
- MVC3使用Area解耦项目
源代码 1.增加AreasChildRegistration类,类继承PortableAreaRegistration 2.增加引用MvcContrib 3.主项目中Area文件夹下增加Web.con ...
- HDU 4262 Juggler 树状数组
将每个球按输入顺序编号,建立 它第几个被扔掉->编号 的映射关系. 记录当前在手里的球的编号,按扔掉的顺序查找这个球的编号,看看这个球是逆时针转到手里更近还是顺时针转到手里更近,即当前扔掉球的编 ...
- linux运维文章
运维中关键技术点解剖:1 大量高并发网站的设计方案 :2 高可靠.高可伸缩性网络架构设计:3 网站安全问题,如何避免被黑?4 南北互联问题,动态CDN解决方案:5 海量数据存储架构 一.什么是大型网站 ...
- ls目录结构
命令ls ls -l = ll -l 详细信息-a 查看隐藏的文件或目录-d 只看目录本身,不列出目录下面的文件和目录 一起使用一般 ls -ld-t 以时间先后排序-i 显示文件节点-h 显示字节大 ...