文章目录

  • 一、队列
  • 二、队列python实现
  • 三、循环队列
  • 四、循环队列python实现
  • 五、双端队列
  • 六、双端队列python实现
  • 七、队列的应用

一、队列

  队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。通俗来讲,队列也是一种线性结构,相比数组,队列对应的操作是数组的子集,只能从一端(队尾)添加元素,只能从另一端(队首)取出元素。队列是一种先进先出(First in first out (FIFO))的数据结构。

二、队列python实现

  队列也可以用顺序表或者链表实现。队列主要实现如下功能:

Queue()创建一个空的队列
enqueue(item)往队列中添加一个item元素
dequeue()从队列头部删除一个元素
is_empty()判断一个队列是否为空
size()返回队列的大小

下面用顺序表结构来实现一个队列

#队列
class Queue(object):'''创建一个空的队列'''def __init__(self):self.__list = []def enqueue(self,item):'''往队列中添加一个item元素'''self.__list.append(item)def  dequeue(self):'''从队列头部删除一个元素'''return self.__list.pop(0)def is_empty(self):'''判断一个队列是否为空'''return self.__list == []def size(self):'''返回队列的大小'''return len(self.__list)
if __name__ == '__main__':s = Queue()s.enqueue(1)s.enqueue(2)s.enqueue(3)print(s.dequeue())print(s.dequeue())print(s.dequeue())
1
2
3

三、循环队列

  在上述实现的队列结构中,删除队首元素的时间复杂度为O(n)。有没有时间复杂度为O(1)的方式呢?那就是循环队列。循环队列有两个指针,指针front指向队首元素,指针tail指向队尾元素的下一位。front == tail队列为空,front == (tail + 1)%c队列列满,其实浪费了一个空间。队首删除元素时,指针front指向下一个元素。

四、循环队列python实现

class LoopQueue(object):def __init__(self, n=2):self.arr = [None] * (n+1)  # 由于特意浪费了一个空间,所以arr的实际大小应该是用户传入的容量+1self.front = 0self.tail = 0self.size = 0
​def __str__(self):return str(self.arr)
​def __len__(self):return len(self.arr)
​def __iter__(self):return iter(self.arr)
​def get_size(self):# 获取队列元素个数return self.size
​def get_capaticty(self):# 获取队列容积(实际可存储元素个数)return self.__len__() - 1
​def is_full(self):# 判断队列是否为满return (self.tail+1) % len(self.arr) == self.front
​def is_empty(self):# 判断队列是否为空return self.size == 0
​def get_front(self):# 获取队首return self.arr[self.front]
​def enqueue(self, e):# 入队if self.is_full():self.resize(self.get_capaticty() * 2)  # 如果队列满,以当前队列容积的2倍进行扩容self.arr[self.tail] = eself.tail = (self.tail+1) % len(self.arr)self.size += 1
​def dequeue(self):# 出队if self.is_empty():raise Exception("Cannot dequeue from en empty queue")
​result = self.arr[self.front]self.arr[self.front] = Noneself.front = (self.front+1) % len(self.arr)self.size -= 1
​# 如果元素个数少于容积的1/4并且元素个数if self.size < self.get_capaticty() // 4 and self.get_capaticty() > 1:self.resize(self.get_capaticty() // 2)return result
​def resize(self, new_capacity):new_arr = [None] * (new_capacity+1)for i in range(self.size):new_arr[i] = self.arr[(i+self.front) % len(self.arr)]
​self.arr = new_arrself.front = 0self.tail = self.sizeif __name__ == '__main__':loop_queue = LoopQueue()loop_queue.enqueue("hello")loop_queue.enqueue("my")print(loop_queue.arr)loop_queue.enqueue("friend")print(loop_queue.get_size())print(loop_queue.arr)print(loop_queue.dequeue())print(loop_queue.arr)print(loop_queue.dequeue())print(loop_queue.arr)loop_queue.enqueue("hello")print(loop_queue.arr)loop_queue.enqueue("my")print(loop_queue.arr)loop_queue.enqueue("love")print(loop_queue.arr)print(loop_queue.dequeue())print(loop_queue.dequeue())print(loop_queue.dequeue())print(loop_queue.arr)print(loop_queue.dequeue())print(loop_queue.arr)
['hello', 'my', None]
3
['hello', 'my', 'friend', None, None]
hello
[None, 'my', 'friend', None, None]
my
[None, None, 'friend', None, None]
[None, None, 'friend', 'hello', None]
[None, None, 'friend', 'hello', 'my']
['love', None, 'friend', 'hello', 'my']
friend
hello
my
['love', None, None, None, None]
love
[None, None, None]

五、双端队列

  双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队。

六、双端队列python实现

  双端队列主要实现如下功能:

Deque()创建一个空的双端队列
add_front(item)从队头加入一个item元素
add_rear( item)从队尾加入一个item元素
remove_front()从队头删除一个item元素
remove_rear()从队尾删除一个item元素
is_empty()判断双端队列是否为空
size()返回队列的大小

#双端队列
class Deque(object):'''创建一个空的双端队列'''def __init__(self):self.__list = []def add_front(self,item):'''从队头加入一个item元素'''self.__list.insert(0,item)def add_rear(self,item):'''从队尾加入一个item元素'''self.__list.append(item)def remove_front(self):'''从队头删除一个item元素'''return self.__list.pop(0)def remove_rear(self):'''从队尾删除一个item元素'''return self.__list.pop()def is_empty(self):'''判断双端队列是否为空'''return self.__list == []def size(self):'''返回队列的大小'''return len(self.__list)if __name__ == "__main__":deque = Deque()deque.add_front(1)deque.add_front(2)print(deque.__list)deque.add_rear(3)deque.add_rear(4)print(deque.__list)print(deque.size())print(deque.remove_front())print(deque.remove_front())print(deque.remove_rear())print(deque.remove_rear())
[2, 1]
[2, 1, 3, 4]
4
2
1
4
3

七、队列的应用

双端队列应用之回文词检测—125. 验证回文串
232. 用栈实现队列
239. 滑动窗口最大值


如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!


数据结构与算法python—5.队列及python实现与leetcode总结相关推荐

  1. python 熊猫钓鱼_Python数据结构与算法之使用队列解决小猫钓鱼问题

    本文实例讲述了Python数据结构与算法之使用队列解决小猫钓鱼问题.分享给大家供大家参考,具体如下: 按照<啊哈>里的思路实现这道题目,但是和结果不一样,我自己用一幅牌试了一下,发现是我的 ...

  2. 视频教程-Python数据结构与算法面试(上)-Python

    Python数据结构与算法面试(上) 东北大学计算机专业硕士研究生,欧瑞科技创始人&CEO,曾任国内著名软件公司项目经理,畅销书作者,企业IT内训讲师,CSDN学院专家讲师,制作视频课程超过1 ...

  3. Python数据结构与算法(1.5)——Python基础之函数与异常

    Python数据结构与算法(1.5)--Python基础之函数与异常 0. 学习目标 1. 函数 1.1 自定义函数 1.2 函数与参数 1.3 函数与返回值 2. 异常处理 2.1 raise 语句 ...

  4. Python数据结构与算法(1.4)——Python基础之控制结构

    Python数据结构与算法(1.4)--Python基础之控制结构 0. 学习目标 1. 代码块与缩进 2. 条件语句 2.1 if 语句 2.2 if 语句的嵌套 2.3 断言 3. 循环 3.1 ...

  5. Python数据结构与算法(1.3)——Python基础之输入、输出与高阶赋值

    Python数据结构与算法(1.3)--Python基础之输入.输出与高阶赋值 0. 学习目标 1. 输入.输出与注释 1.1 获取用户输入 1.2 格式化输出 1.2.1 基本方法 1.2.2 fo ...

  6. Python数据结构与算法(1.2)——Python基础之变量与内置数据类型

    Python数据结构与算法(1.2)--Python基础之变量与内置数据类型 0. 学习目标 1. Python 程序的运行 1.1 Python 交互式解释器 1.2 Python 程序脚本 2. ...

  7. Python数据结构与算法(1.6)——Python基础之类与模块化

    Python数据结构与算法(1.6)--Python基础之类与模块化 0. 学习目标 1. 面向对象编程:类 1.1 面向对象编程的基本概念 1.1.1 多态 1.1.2 封装 1.1.3 继承 1. ...

  8. 数据结构与算法之循环队列的操作

    数据结构与算法之循环队列的操作 /* 循环队列的入队和出队算法设计 初始化循环队列 .打印队列.插入元素到循环队列.获取循环队列的首元素,元素不出队.出队.获取循环队列元素个数.判断循环队列的空和满. ...

  9. 数据结构与算法-栈与队列

    数据结构与算法-栈与队列 栈 基本概念 简单表述就是仅在表尾进行插入和删除操作的线性表. 常见操作 入栈和出栈, 均在线性表的尾部进行. 基本原则就是, 先入后出. 队列 基本概念 和栈不同的是,队列 ...

  10. apriori算法c++实现_经典数据结构与算法(四):Python/C/C ++实现队列类型双端队列数据结构...

    前期文章点击这里: 经典数据结构与算法(一):Python/C/C ++实现堆栈和队列 双端队列或双端队列是一种队列,其中可以从前面或后面执行元素的插入和删除.因此,它不遵循FIFO规则(先进先出). ...

最新文章

  1. 《云数据管理:挑战与机遇》2.3.3 恢复和提交
  2. Eclipse中安装HibernateTools插件
  3. 一些通用性的haproxy调优tips
  4. Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart
  5. PyTorch教程(四):维度变换
  6. Chrome浏览器扩展程序的本地备份
  7. php br2nl,收藏一些规范化输入输出的PHP函数
  8. alibaba fastjson
  9. 真正的Google搜索
  10. 【Sqoop】从MySQL同步数据到Hive的操作参数解析
  11. 移动视频监控(2)---原型开发---(音视频编解码多平台移植(for window/wince))ffmpeg --自由之路即是曲折之路。...
  12. win10 Anaconda 安装教程
  13. python32位系统下载_python 32位安装包
  14. java请求接口参数为json格式
  15. 如何批量将JPG图片转换成BMP格式?
  16. php 图片折角处理,如何使用CSS3实现折角效果
  17. 【flask高级】结合源码解决flask经典报错:Working outside of application context
  18. word勾选框涂黑和打勾
  19. R 散点图,添加标签
  20. Revit开发读取CAD信息

热门文章

  1. Python迷宫游戏(基础版)
  2. PTA题---求两个有序序列中位数所体现的思想。
  3. 安卓Service完全解析(上)
  4. 【转】js 获取浏览器高度和宽度值(多浏览器
  5. Parts of a URL
  6. C# 连接 SQL Server 数据库,出现异常:provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接...
  7. 链表简介(一)——创建单向动态链表及输出单向链表内容
  8. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre
  9. C#基础知识之图解TCP IP》读书笔记
  10. mongodb的连接和开启安全验证