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) ...
随机推荐
- mongoDB坑
1 mongodb.cnf文件中有个选项为bind_id:127.0.0.1,如果是测试环境,需要远程访问的话,就先改成0.0.0.1 auth:如果只是学习的话,建议先改成false,否则后面会有各 ...
- Convert.ToBase64String(Byte[])和Encoding.UTF8.GetString(Byte[])的区别
Encoding.UTF8.GetString是针对使用utf8编码得到的字符串对应的byte[]使用,可以还原我们能看懂的字符串而Convert.ToBase64String是对任意byte[]都可 ...
- cloud-utils
官方下载:https://launchpad.net/cloud-utils rpm包下载地址:http://rpmfind.net/linux/rpm2html/search.php?query=c ...
- redis的socket event loop
很早之前就因为nosql就听说了redis,直到去年才真正去了解,只能说相见恨晚. 因为数据库相关,我以为这应该是个庞然大物,万万没想到,源码不到2M,所以,我不知道该说啥了... 还是来点靠谱的: ...
- Centos安装后的一些必要处理工作
1永久关闭selinux,修改成permissive或者disabled(建议),修改完需重启 2配置network 3.禁止ping(可选,一般不需要禁止)(默认为0位启用ICMP协议,1为禁止), ...
- 使用SecureCRT设置linux系统登录的ssh公钥认证
1.修改ssh配置文件/etc/ssh/sshd_configRSAAuthentication yes //使用RSA加密算法PubkeyAu ...
- 写把proto函数搞清楚
在做blk层之前,先把proto搞清楚 ffi_lua metatype可以给函数加方法, lua中冒号是啥意思?冒号会传入self,但是点号不会传入self
- 细说php2[正则表达式学习笔记]
<细说php>这本书应该是每个php程序员入门的必读书籍,里面讲的很多知识都很系统和详细,看了正则这部分,并练习了里面的案例,发现自己已经会了很多.... header('Content- ...
- vue & lifecycle methods & this bug & ES6 Arrow function & this bind bug
vue & lifecycle methods & this bug ES6 Arrow function & this bind bug bad fetchTableData ...
- Scala 基础(7)—— 函数字面量和一等函数
1. 函数字面量 在 Scala 基础(3)—— 基础类型和基础操作 中提到了函数字面量,这里具体解释函数字面量的语法. 下面展示一个具体的函数字面量,它由三部分组成: (x: Int, y: Int ...