数据结构必会|队列和双端队列(Python)

简介: 队列和双端队列

队列

1. 队列是什么

​ 队列的思想比较贴近于我们的生活,当我们在超市排队结账的时候,其实就是一个队列的实现,也就是先排队的人先结账,后排队的人后结账的思想。

​ 和栈一样,队列也是一个有序的集合,添加操作发生在尾部,移除操作则发生在头部,新元素会从尾部进入队列,然后一直向前移动到头部,直到成为下一个被移除的元素。

​ 队列的性质规定了最新添加的元素必须在队列的尾部等待,在队列中时间最长的元素排在头部,这种原则被称为FIFO(first-in first-out)

在这里插入图片描述

2. 队列的实现

​ 队列的实现方式很简单,我们只要保证元素“从哪进,不从哪出”就可以了,使用列表的方式实现队列我们可以从尾部使用insert()函数插入元素,再使用pop()推出头部的元素。具体的实现方法如下:

class Queue:
    def __init__(self):
        self.items = []
    
    # 判断是否为空队列
    def isEmpty(self):
        return self.items == []

    # 入队列
    def enqueue(self, item):
        self.items.insert(0, item)

    # 出队列
    def dequeue(self):
        return self.items.pop()

    # 队列的长度
    def size(self):
        return len(self.items)

​ 测试结果如下:

# 测试队列
q = Queue()
q.isEmpty()

# 传入元素
q.enqueue('I')
q.enqueue('like')
q.enqueue('python')
q.size()
q.dequeue()

# 输出
'I'

双端队列

1. 双端队列的概念

​ 双端队列相对于之前的数据结构来说更加的自由,双端队列对于在哪一端进行添加和移除元素是没有限制的,也就意味着可以从任意一端进行元素的添加和移除。

​ 双端队列的性质也决定了其具有两种不同的原则:LIFO和FIFO。

在这里插入图片描述

2. 双端队列的实现

​ 实现双端队列的时候我们可以把之前用在栈和队列上面的做法结合在一起来实现LIFO和FIFO两种思想。具体的实现方法如下:

class Deque:
    def __init__(self):
        self.items = []

    # 判断是否为空
    def isEmpty(self):
        return self.items == []

    # 从前端插入数据
    def addFront(self, item):
        self.items.append(item)

    # 从尾端插入数据
    def addRear(self, item):
        self.items.insert(0, item)

    # 从前端删除数据
    def removeFront(self):
        return self.item.pop()

    # 从尾端删除数据
    def removeRear(self):
        return self.item.pop(0)

    # 队列的长度
    def size(self):
        return len(self.items)

​ 测试结果如下:

# 测试
d = Deque()
d.isEmpty()

# 插入元素
d.addFront('I')
d.addFront('like')
d.addRear('Python')

# 测试长度
d.size()

# 输出
3
相关文章
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
142 77
|
1天前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
2月前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
132 66
|
1月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
43 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
3月前
|
存储 开发者 索引
Python 中常见的数据结构
这些数据结构各有特点和适用场景,在不同的编程任务中发挥着重要作用。开发者需要根据具体需求选择合适的数据结构,以提高程序的效率和性能
151 59
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
46 9
|
1月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
38 7
|
2月前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
68 20
|
3月前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
111 33
|
3月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?

热门文章

最新文章