双端队列

[C++ STL] deque使用详解

[亡魂溺海] 提交于 2020-03-27 22:57:10
[C++ STL] deque使用详解 目录 一、概述 二、定义及初始化 三、基本操作函数 3.1 容量函数 3.2 添加函数 3.3 删除函数 3.4 访问函数 3.5 其他函数 四、迭代器与算法 五、总结 回到顶部 一、概述 deque(双端队列)是由一段一段的定量连续空间构成,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速。 在中间部分安插元素则比较费时,因为必须移动其它元素。 回到顶部 二、定义及初始化 使用之前必须加相应容器的头文件: #include <deque> // deque属于std命名域的,因此需要通过命名限定,例如using std::deque; 定义的实现代码如下: deque<int> a; // 定义一个int类型的双端队列a deque<int> a(10); // 定义一个int类型的双端队列a,并设置初始大小为10 deque<int> a(10, 1); // 定义一个int类型的双端队列a,并设置初始大小为10且初始值都为1 deque<int> b(a); // 定义并用双端队列a初始化双端队列b deque<int> b(a.begin(), a.begin()+3); // 将双端队列a中从第0个到第2个(共3个)作为双端队列b的初始值 除此之外,还可以直接使用数组来初始化向量: int n[] = { 1, 2, 3, 4

队列

▼魔方 西西 提交于 2020-03-07 23:21:23
队列 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 单队列(queue) 在C++中只要#include即可使用队列类,其中在面试或笔试中常用的成员函数如下(按照最常用到不常用的顺序) push() :从队尾压入 pop() : 从队头弹出 size() :返回队列的元素个数 empty() :判断队列是否为空,为空返回true,反之返回false front() :返回队头的元素,就是最先压入的元素 back() :返回队尾的元素,就是最后压入的元素 双端队列(deque,全名double-ended queue) 是一种具有队列和栈的性质的数据结构,即可(也只能)在线性表的两端进行插入和删除。deque类常用的函数如下: (1) 构造函数 deque():创建一个空deque deque(int nSize):创建一个deque,元素个数为nSize deque(int nSize,const T& t):创建一个deque,元素个数为nSize,且值均为t deque(const deque &):复制构造函数 (2) 增加函数 void push_front(const T& x):双端队列头部增加一个元素X

数据结构笔记:双端队列

守給你的承諾、 提交于 2020-03-07 11:22:14
原文地址 分类目录——数据结构笔记 双端队列(deque,double-ended queue),是一种具有队列和栈的性质的数据结构。 双端队列中每一端,都可以进行存入和取出,去其中一段,都像一个栈一样。 存取也只限定在两端,不能在中间 双端队列的实现 通过线性表实现 class Dequeue ( object ) : def __init__ ( self ) : '''初始化一个空队列''' self . __list = [ ] def add_front ( self , item ) : '''从队列首添加''' self . __list . insert ( 0 , item ) def add_rear ( self , item ) : '''从队列尾添加''' self . __list . append ( item ) def pop_front ( self ) : '''从队列首删除''' return self . __list . pop ( 0 ) # 时间复杂度O(n) def pop_rear ( self ) : '''从队列尾删除''' return self . __list . pop ( ) def is_empty ( self ) : '''是否空''' return not self . __list def size (

PYTHON数据结构与算法学习笔记(四)

半腔热情 提交于 2020-03-01 02:31:48
目录 栈 栈结构实现 队列 队列的实现 双端队列 双端队列的实现 栈 栈(stack),也称堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序。 由于栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。 栈结构实现 栈可以用顺序表实现,也可以用链表实现。 栈的操作 Stack() 创建一个新的空栈; push(item) 添加一个新的元素item到栈顶; pop() 弹出栈顶元素; peek() 返回栈顶元素; is_empty() 判断栈是否为空; size() 返回栈的元素个数。 这里使用顺序表(即python中的list)举例 class Stack ( object ) : def __init__ ( self ) : self . items = [ ] 1、 push(item) 添加一个新的元素item到栈顶 def push ( self , item ) : self . items . append ( item ) 2、 pop() 弹出栈顶元素 def pop (

循环队列(普通+双端)

こ雲淡風輕ζ 提交于 2020-02-24 20:18:45
一、普通循环队列 1、普通循环队列明细 循环队列是针对 顺序队列中最大化利用内存空间 的一种解决方法,可以解决当队列(数组)不可再插入新元素但队列的实际可用空间并未占满的问题。 相比普通的队列, 多了个指向队头的索引 ,而且也是只能在头部删除元素,尾部插入元素。故删除元素的时候,该索引需要往后走一个位置(取模)。插入元素还是队尾插入(取模)。 public class CircleQueue < E > { private int size = 0 ; private int front ; private E [ ] elements ; private final int DEFAULT_CAPACITY = 10 ; public CircleQueue ( ) { elements = ( E [ ] ) new Object [ DEFAULT_CAPACITY ] ; front = 0 ; } public boolean isEmpty ( ) { return size == 0 ; } public void offer ( E element ) { ensureCapacity ( size + 1 ) ; elements [ ( front + size ) % elements . length ] = element ; /

leetcode -- 622、641

痞子三分冷 提交于 2020-02-16 14:19:17
文章目录 622.设计循环队列 题目描述 解题方法 641.设计循环双端队列 题目描述 解题思路 622.设计循环队列 题目描述 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实现应该支持如下操作: MyCircularQueue(k): 构造器,设置队列长度为 k 。 Front: 从队首获取元素。如果队列为空,返回 -1 。 Rear: 获取队尾元素。如果队列为空,返回 -1 。 enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。 deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。 isEmpty(): 检查循环队列是否为空。 isFull(): 检查循环队列是否已满。 示例: MyCircularQueue circularQueue = new MycircularQueue(3); // 设置长度为 3 circularQueue.enQueue(1); // 返回 true circularQueue.enQueue

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

雨燕双飞 提交于 2020-02-11 08:29:17
题目链接 https://leetcode-cn.com/problems/sliding-window-maximum/ 题目内容 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置|最大值 -|- [1 3 -1] -3 5 3 6 7|3| 1 [3 -1 -3] 5 3 6 7|3| 1 3 [-1 -3 5] 3 6 7| 5| 1 3 -1 [-3 5 3] 6 7| 5| 1 3 -1 -3 [5 3 6] 7|6| 1 3 -1 -3 5 [3 6 7]|7| 分析 1、创建一个双端队列用来存储nums数组中元素的索引; 2、创建一个结果数组存储达到窗口大小时,在窗口内的元素; 3、没达到窗口大小时:如果双端队列是空的,那么直接从队尾插入元素的索引,如果双端队列不为空,需要保证双端队列中的索引在nums中的值是递减的。达到窗口大小时,直接将双端队列的头部元素在nums中的值存储到结果数组。 如图: 先放动态图: 再放静态图; 代码 import jdk.jshell.spi

第 1 章之:队列的特性应用

巧了我就是萌 提交于 2020-02-06 11:46:38
声明:文章为博主原创,转载请联系博主。文章若有错误和疏漏之处,还望大家不吝赐教! 第一章:数据结构与算法基础 =========================================================== 本章重点内容为: 1.数据结构基础与线性表:下三角矩阵元素存储位置计算、 队列的特性应用 、栈的特性应用 2.广义表:无 3.树:二叉树的特性、二叉树的遍历、哈夫曼树 4.图:边与顶点的关系 5.查找与排序:折半查找、基数排序算法以及这些算法的性能分析 6.算法基础知识:时间复杂度分析 =========================================================== 本篇文章主要介绍 队列的特性应用 。 一.概念介绍 首先我们来简单了解一下什么是队列。 队列(Queue)是一种特殊的线性表 。它的特殊之处在于 它只允 许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作 ,和栈一样,队列是一种 操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列为空时,称为 空队列。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个 队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能 最先从队列中删除,故队列又称为

【Python数据结构与算法笔记day24】5.2. 双端队列

此生再无相见时 提交于 2020-02-02 01:06:31
文章目录 5.2. 双端队列 双端队列 操作 实现 5.2. 双端队列 双端队列 双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构。 双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队。 操作 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 . items = [ ] def is_empty ( self ) : """判断队列是否为空""" return self . items == [ ] def add_front ( self , item ) : """在队头添加元素""" self . items . insert ( 0 , item ) def add_rear ( self , item ) : """在队尾添加元素""" self

deque容器的基本使用

懵懂的女人 提交于 2020-02-01 02:57:41
deque容器 使用deque 。即 双端队列 ;特点为front和back都可以插入,也都可以删除; 只需要看懂数据结构中的双端队列,使用就根据特点即可; 代码 # include <iostream> # include <deque> using namespace std ; # include <algorithm> //iterator 普通迭代器 reversed_iteraotr 反向迭代器 const_iteraotr 只读迭代器 void printDeque ( const deque < int > & d ) { for ( deque < int > :: const_iterator it = d . begin ( ) ; it != d . end ( ) ; ++ it ) { cout << * it << " " ; } cout << endl ; } void test01 ( ) { deque < int > d ; d . push_back ( 10 ) ; d . push_back ( 20 ) ; d . push_back ( 30 ) ; d . push_front ( 40 ) ; d . push_front ( 50 ) ; d . push_front ( 60 ) ; printDeque ( d ) ;