双端队列

ArrayDeque详解

依然范特西╮ 提交于 2020-01-28 00:00:14
美人如斯! ArrayDeque是java中对双端队列的线性实现 一.特性 无容量大小限制,容量按需增长; 非线程安全队列,无同步策略,不支持多线程安全访问; 当用作栈时,性能优于 Stack ,当用于队列时,性能优于 LinkedList 两端都可以操作 具有fail-fast特征 不能存储 null 支持双向迭代器遍历 注意: ArrayDeque的迭代器和大多数容器迭代器一样,都是快速失败(fail-fast),但是程序不能利用这个特性决定是或否进行了并发操作。 二.数据结构 为了更好的理解使用线性数组实现的双端队列,这里我们先来图解线性数组实现基本数据结构-队列: 如上图所示,head指向队头,入队加元素时,tail队尾向后移动,出队时从head出取出元素并移除,这样就利用了线性数组实现先进先出的队列数据结构,当head等于tail时,则表示队列为空。 但是这样存在问题:当不断出队时,head向后移动,前面空出来的空间就被浪费,导致不断入队时,需要数组扩容,出队时造成大量空间无法使用,空间利用率低下! 假设,如果能将前面空出来的空间也利用起来进行存储末尾的元素,则空间使用率将提高,这里就需要有个循环的思维,把这种线性的弯曲成一个圆环,这样就可以反复使用空出来的空间,入队时使用出队空余出来的空间,就解决以上的问题,图解如下: 同样,当head等于tail时,则表示循环队列为空

双端队列

人走茶凉 提交于 2020-01-25 19:15:19
摘自:https://www.jianshu.com/p/1f1520db325d 双端队列是与队列类似的项的有序集合。 双端队列有两个端部,首部和尾部,并且项在集合中保持不变。 双端队不同的地方是添加和删除项是非限制性的。可以在前面或后面添加新项;同样,可以从任一端移除现有项。 双端队列抽象数据类型 如上所述,deque 被构造为项的有序集合,其中项从首部或尾部的任一端添加和移除。 下面给出了 deque 操作。 操作 描述 返回值 Deque() 创建一个空的新 deque,不需要参数 返回空的 deque addFront(item) 将一个新项添加到 deque 的首部,需要 item 参数 不返回任何内容 addRear(item) 将一个新项添加到 deque 的尾部,需要 item 参数 不返回任何内容 removeFront() 从 deque 中删除首项,deque 被修改 返回删除项 item removeRear() 从 deque 中删除尾项,deque 被修改 返回删除项 item isEmpty() 测试 deque 是否为空,不需要参数 返回布尔值 size() 返回 deque 中的项数,它不需要参数 返回一个整数 python实现双端队列 class Deque(object): def __init__(self): self.items = [

python//Jan.21th,2020//双端队列

﹥>﹥吖頭↗ 提交于 2020-01-22 08:19:03
# coding=utf-8 # 双端队列(允许两端都可以插入,删除)的实现 class Deque ( object ) : def __init__ ( self ) : self . list = [ ] # 从队列头部添加元素 def add_front ( self , item ) : # self.list.push(item) # O(n) self . list . insert ( 0 , item ) # 从队列尾部添加元素 def add_rear ( self , item ) : self . list . append ( item ) # 出队列 def pop_front ( self ) : # list的头部出队列,O(n) return self . list . pop ( 0 ) # 出队列 def pop_rear ( self ) : # list的尾部出队列,O(n) return self . list . pop ( ) # 判断队列是否为空 def is_empty ( self ) : return self . list == [ ] # 获取队列的大小 def size ( self ) : return len ( self . list ) if __name__ == "__main__" : q = Deque

双端队列 (25分)

白昼怎懂夜的黑 提交于 2020-01-16 02:32:07
双端队列 (25分) 双端队列(deque,即double-ended queue的缩写)是一种具有队列和栈性质的数据结构,即可以(也只能)在线性表的两端进行插入和删除。若以顺序存储方式实现双端队列,请编写例程实现下列操作: Push(X,D):将元素X插入到双端队列D的头; Pop(D):删除双端队列D的头元素,并返回; Inject(X,D):将元素X插入到双端队列D的尾部; Eject(D):删除双端队列D的尾部元素,并返回。 函数接口定义: bool Push( ElementType X, Deque D ); ElementType Pop( Deque D ); bool Inject( ElementType X, Deque D ); ElementType Eject( Deque D ); 其中Deque结构定义如下: typedef int Position; typedef struct QNode *PtrToQNode; struct QNode { ElementType Data; / 存储元素的数组 / Position Front, Rear; / 队列的头、尾指针 / int MaxSize; / 队列最大容量 */ }; typedef PtrToQNode Deque; 注意:Push和Inject应该在正常执行完操作后返回true

设计循环双端队列

情到浓时终转凉″ 提交于 2020-01-14 23:08:01
题目: 设计实现双端队列。 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k。 insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。 insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。 deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。 deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。 getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。 getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。 isEmpty():检查双端队列是否为空。 isFull():检查双端队列是否满了。 方法一:数组实现 class MyCircularDeque { int [ ] a ; int size = 0 ; /** Initialize your data structure here. Set the size of the deque to be k. */ public MyCircularDeque ( int k ) { a = new int [ k ] ; } /** Adds an item at the front of Deque.

Python数据类型:双端队列deque-比列表list性能更高的一种数据类型

旧街凉风 提交于 2020-01-10 18:39:37
Python数据类型:双端队列 说到容器类型,大家第一时间想到的多半是list,而list确实也能解决大部分的需要,但碰到列表内的数据量相当大的时候,性能问题就显得尤为重要;再或者列表被恶意注入一个无穷大的数据量时,就可能会暴露出安全问题来。较好的替代方法是:collections.deque。获得性能或安全的同时,牺牲的是数据大小。 deque队列两端取出或者删除时间复杂度都是O(1),而列表都是O(n),队列的性能比列表更好 简介 欢迎关注我的公众号:Python雁横 collections.deque对象 (双端队列),支持从任意一端增加删除元素。 deque 是线程安全的,内存高效的队列,它被设计为从两端追加和弹出都非常快。 创建deque对象 deque() 用于创建一个deque对象 可选参数 : iterable 一个可迭代对象,如列表,元组 maxlen 最大长度,超出最大长度,会将之前的元素挤出去 示例: from collections import deque dq = deque([1,2,3,4]],maxlen=10) deque对象的方法 dq.append(x) 在右端添加x >>>dq.append(5) >>>print(dq) deque([1, 2, 3,4,5]) dq.appendleft(x) 在左端添加x >>>dq

HDU6375双端队列

狂风中的少年 提交于 2020-01-07 14:11:05
要点分析: 1.本题可以使用C++STL中的deque双端队列来方便解决(底层是一个双向的链表) 2.值得注意的是N的上限为150000,所以直接开这么大的空间会超内存,可以配合map一起使用 关于双端队列的声明: 使用<queue>头文件 主要用法: deque.push_back(val); deque.push_front(val); deque.pop_front(); deque.pop_back(); deque.front(); deque.back(); deque.clear(); 本题代码: 1 #include<iostream> 2 #include<queue> 3 #include<map> 4 using namespace std; 5 6 //const int N = 150005; 7 map<int, deque<int> > q; 8 9 void read(int &x){ 10 char ch = getchar();x = 0; 11 for (; ch < '0' || ch > '9'; ch = getchar()); 12 for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0'; 13 } 14 15 int main(){ 16 int N, Q

双端队列

余生颓废 提交于 2019-12-26 22:53:07
rear++: 出队, front++ 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 双端队列 (可以理解为中间站了一个人,push和pop就在他左边进行,而inject和eject在他右边进行) 注意:双端队列使用了循环队列。判断满不满的条件是多开一个空间,即判断rear与front的关系。 我们rear指针指向元素的下一个空位置,front指向元素 push 将元素插入表头 front- - pop 删除头部元素 front++ inject 将元素插入到表尾 rear++ eject 删除尾部元素 rear- - 初始化时,rear=front=0; 有- - 操作,可能会出现负值,所以需要+size在取余的操作 # include <stdio.h> # include <stdlib.h> typedef struct QNode { int * Data ; int Front , Rear ; int MaxSize ; // 队列最大容量 } QNode , * Deque ; Deque CreateDeque ( int MaxSize ) { /* 注意:为区分空队列和满队列,需要多开辟一个空间

内功心法 -- java.util.LinkedList<E> (3)

Deadly 提交于 2019-12-22 08:20:19
写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 下文主要对java.util.LinkedList<E>的5个修改操作进行介绍,主要内容包括: 1、LinkedList常用5个修改操作介绍 参考内容: 1、JDK源码(1.7) -------------------------------------------------------------------- 1、LinkedList常用5个修改操作介绍 (1)boolean add(E e) 功能: 将指定元素插入此双端队列的尾部 示例代码: 1 import java.util.LinkedList; 2 3 public class LinkedListDemo { 4 public static void main(String[] args) { 5 /*********测试LinkedList的'boolean add()'方法的使用**********/ 6 7 //创建一个LinkedList对象 8 LinkedList<Student> linkedList = new LinkedList<Student>(); 9 10 //创建一个Student对象

栈、队列和双端队列 Python3

扶醉桌前 提交于 2019-12-14 20:19:40
文章目录 栈 队列 双端队列 栈 栈只允许在一端进行操作,所以是后进先出即LIFO 可以用顺序表实现,也可以用链表实现 以下为用顺序表实现的代码 class Stack ( object ) : """栈""" def __init__ ( self ) : self . __list = [ ] def push ( self , item ) : """添加一个新的元素item到栈顶""" self . __list . append ( item ) def pop ( self ) : """弹出栈顶元素""" return self . __list . pop ( ) def peek ( self ) : """返回栈顶元素""" if self . __list : return self . __list [ - 1 ] else : return None def is_empty ( self ) : """判断栈是否为空""" return self . __list == [ ] # return not self.__list def size ( self ) : """返回栈的元素个数""" return len ( self . __list ) if __name__ == "__main__" : s = Stack ( ) s . push