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) ...
随机推荐
- 《算法》C++代码 快速排序
快速排序,简称快排,常称QuickSort.QSort.在排序算法中非常常用,其编程复杂度低,时间复杂度O(NlogN),空间复杂度O(N),执行效率稳定,而且常数很低. 基本思想就是二分,例如你要将 ...
- Canvas 图片绕边旋转的小动画
/** * 图片绕边旋转的小动画 */ function initDemo10() { var canvas = document.getElementById("demo10") ...
- LDA和PCA降维的原理和区别
LDA算法的主要优点有: 在降维过程中可以使用类别的先验知识经验,而像PCA这样的无监督学习则无法使用类别先验知识. LDA在样本分类信息依赖均值而不是方差的时候,比PCA之类的算法较优. LDA算 ...
- Struts2 学习笔记
1)Strust2是以WebWork为核心,采用拦截器的机制对用户请求进行处理. 2)Struts2框架结构: 3)简单来看整个Struts2的处理过程可以简单的理解为 用户的请求发送给对应的Acti ...
- WSingle主题 – 可能是最好的WordPress小说主题,美观大方,功能强大
今天,waitig给大家带来了一款强大WordPress小说主题 – WSingle主题. 一.概览 WSingle主题2.0版本已经发布,点击查看详情:[重磅]WSingle主题2.0版本发布,新增 ...
- C++ Programming with TDD之一:GMOCK框架简介
所谓测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法.就是在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测 ...
- CSS 3中细线边框如何实现?
在app应用开发中,我们常常都需要用到css3来设置应用的样式.由于app都是在移动设备上进行展示,所以边框描边的线一般都小于1px,而以往我们使用的都是1px及以上的.那么问题来了,对于小于1px的 ...
- mongo-aggregate命令详解
一.aggregate执行流程和特性 1.执行流程: db.collection.aggregate()是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管 ...
- Jquery不同版本共用的解决方案(插件编写)
最近在为某公司做企业内部UI库,经过研究分析和评审,决定基于Jquery开发,结合Bootstrap插件那简洁,优雅,高效的思想进行插件编写. 但是在编写的过程中遇到一个头疼的问题,就是正在编写的插件 ...
- 模拟Windows系统“回收站”
HTML: <!DOCTYPE html><html> <head> <meta http-equiv="content-type" co ...