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》——第7章:数学和概率论——题目7
2014-03-20 02:29 题目:将质因数只有3, 5, 7的正整数从小到大排列,找出其中第K个. 解法:用三个iterator指向3, 5, 7,每次将对应位置的数分别乘以3, 5, 7,取三 ...
- linux统计分析流量-wireshark
wireshark是一款带界面的开源抓包工具,可以用来对系统流量进行统计分析. 安装 由于wireshark是带界面的,所以一般在界面环境下运行,可以通过yum安装: $ yum install -y ...
- leetcode 【 Linked List Cycle 】 python 实现
题目: Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ...
- C++的字符输入
字符串的输入有6中方式,这六种方式各有各的特点,我这篇学习笔记是自己的经验总结,没有去探讨内存,函数库等的复杂问题,仅仅是为了实用: 第一:cin cin一次接受一个字符,所以有的人会选择定义一个字符 ...
- 孤荷凌寒自学python第三十三天python的文件操作初识
孤荷凌寒自学python第三十三天python的文件操作初识 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天开始自学python的普通 文件操作部分的内容. 一.python的文件打开 ...
- cloud.cfg_for_ubuntu
user: default disable_root: false preserve_hostname: false cloud_init_modules: - bootcmd - resizefs ...
- django的聚合函数和aggregate、annotate方法使用
支持聚合函数的方法: 提到聚合函数,首先我们要知道的就是这些聚合函数是不能在django中单独使用的,要想在django中使用这些聚合函数,就必须把这些聚合函数放到支持他们的方法内去执行.支持聚合函数 ...
- 获取地址栏参数 - queryString(正则表达式版本)
获取所有query string function queryStringAll() { var reg = /(?:^|&)([^&]+)=([^&]+)(?=&|$ ...
- Codeforces Round #357 (Div. 2) B
B. Economy Game time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- Git基本用法简介
一. git和svn的主要区别 git是一个分布式的版本控制工具,而svn是一个集中式版本控制工具. 二. git工具安装 首先下载git:https://gi ...