双端队列

容器的分类与各种测试(三)——queue

萝らか妹 提交于 2019-12-09 18:42:58
queue是单端队列,但是在其 实现上是使用的双端队列 ,所以在queue的实现上多用的是deque的方法。(只要用双端队列的一端只出数据,另一端只进数据即可从功能上实现单端队列)如下图 例程 #include<stdexcept> #include<string> #include<cstdlib> #include<cstdio> #include<algorithm> #include<iostream> #include<ctime> #include<queue> using namespace std; long get_a_target_long() { long target = 0; cout<<"target(0~"<<RAND_MAX<<"):"; cin>>target; return target; } string get_a_target_string() { long target = 0; char buf[10]; cout<<"target(0~"<<RAND_MAX<<"):"; cin>>target; snprintf(buf, 10, "%ld", target); return string(buf); } int compareLongs(const void* a, const void* b) { return (*(long*

Java的Queue集合

对着背影说爱祢 提交于 2019-12-04 20:49:16
Queue用于模拟队列这种数据结构,队列通常是指“先进先出”FIFO的容器,队列的头部保存在队列中存放时间最长的元素,队列的尾部保存在队列中存放时间最短的元素。Queue接口中定义了如下几个方法void add(Object e)将指定的元素加入到此队列的尾部;Object element()获取队列头部的元素,但是不删除该元素。boolean offer(Object e):将指定的元素加入到此队列的尾部。Object peek()获取队列的头部元素,但不删除该元素,如果队列为空返回null。Object poll()获取队列的头部元素,并删除该元素。如果队列为空返回null。Object remove():获取队列头部的元素,并删除该元素。Queue接口有一个priorityQueue实现类,除此之外Queue还有一个Deque的接口,Deque代表一个“双端队列”,双端队列可以同时从两端来添加、删除元素,因此Deque的实现类即可当成队列使用也可以当成栈使用。 1.PriorityQueue是一个比较标准的队列实现类,PriorityQueue保存队列元素的顺序并不是按加入的队列的顺序,而是按照队列元素大小进行重新排列。因此当代调用peek()方法或者poll()方法取出队列的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素

Java 并发工具包 java.util.concurrent 用户指南

允我心安 提交于 2019-12-04 18:46:54
译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新: http://tutorials.jenkov.com/java-util-concurrent/index.html 。 本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友可以去 Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf[带书签] 进行下载。 1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包。这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类。在这个包被添加以前,你需要自己去动手实现自己的相关工具类。 本文我将带你一一认识 java.util.concurrent 包里的这些类,然后你可以尝试着如何在项目中使用它们。本文中我将使用 Java 6 版本,我不确定这和 Java 5 版本里的是否有一些差异。 我不会去解释关于 Java 并发的核心问题 - 其背后的原理,也就是说,如果你对那些东西感兴趣,参考《 Java 并发指南 》。 半成品 本文很大程度上还是个 "半成品",所以当你发现一些被漏掉的类或接口时,请耐心等待。在我空闲的时候会把它们加进来的。 2. 阻塞队列 BlockingQueue java

集合之队列[Queue, Deque],双端队列[ArrayDeque, LinkedList],优先级队列[PriorityQueue]

自古美人都是妖i 提交于 2019-12-04 11:00:24
数据结构中的 队列 了解以下,"先进先出"是队列的最大的特点,也就是只能在头部访问一个元素,在尾部添加一个元素。还有一种叫做 双端队列 。可以有效地在头部和尾部同时添加或删除元 素。 不支持在队列中间添加元素。 在 JDK6 中引人了 Deque 接口, 并由 ArrayDeque 和 LinkedList 类实现。这两个类都提供了双端队列, 而且在必要时可以增加队列的长度。在并发包下还提供了有限队列和有限双端队列。 队列接口Queue 首先看看在JDK中,队列接口中都定义了哪些方法: public interface Queue<E> extends Collection<E> { // 继承自Collection接口的方法, // 在容量允许的情况下将元素放入队列返回true,空间不够时抛出异常 boolean add(E e); // 在容量允许的情况下插入元素,在容量限制时,优于add方法,空间不够导致添加失败返回false, boolean offer(E e); // 返回并且删除队列头的元素,队列为空抛出异常 E remove(); // 返回并且删除队列头的元素,队列为空返回null E poll(); 返回但不删除队列头的元素,队列为空抛出异常 E element(); 返回但不删除队列头的元素,队列为空返回null E peek(); } 双端队列接口Deque

【转】 Java 并发工具包 java.util.concurrent 用户指南

廉价感情. 提交于 2019-12-04 00:56:20
http://blog.csdn.net/defonds/article/details/44021605 译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新: http://tutorials.jenkov.com/java-util-concurrent/index.html 。 本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友可以去 Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf[带书签] 进行下载。 1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包。这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类。在这个包被添加以前,你需要自己去动手实现自己的相关工具类。 本文我将带你一一认识 java.util.concurrent 包里的这些类,然后你可以尝试着如何在项目中使用它们。本文中我将使用 Java 6 版本,我不确定这和 Java 5 版本里的是否有一些差异。 我不会去解释关于 Java 并发的核心问题 - 其背后的原理,也就是说,如果你对那些东西感兴趣,参考《 Java 并发指南 》。 半成品 本文很大程度上还是个 "半成品"

双端队列

匿名 (未验证) 提交于 2019-12-03 00:40:02
我们前面讲了集合,堆,今天要讲的是双端队列。这三个的大致表现形式都差不多,所以我们把这三个连在一起学习。 双端队列的作用主要是支持队首,也就是左端高效的附加和弹出元素,注意下,列表是没有这个功能的喔~ 我们也可以使用双端队列高效地旋转元素,比如使用ratate。 我们来看一段代码,你大概就能够明白我的意思了: from collections import deque q = deque(range(5 )) q.append( 5 ) q.appendleft( 6 ) q deque([6,0,1,2,3,4,5]) q.pop() # 按回车,得到的结果是:5 q.popleft() # 按回车,得到的结果是:6 q.rotate(3 ) q # 按回车,得到的结果是:deque([2,3,4,0,1]) q,rotate(-1 ) q # 按回车,得到的结果是:([3,4,0,1,2]) 其他的代码我就不解释了,相信你是能够看得懂的,我就直接是一下rotate这个函数方法,你看函数内的值是3的时候,正数,我们最后的三个数给挪到最前面来,也就是把2,3,4挪到最前面,注意一下,5和6,刚才已经用pop删除掉了。接着看-1,负数,就把最前面的2挪到最后面。 好的,今天的内容就讲到这里啦~ (文章图片若有侵权,请联系作者删除) 原文:https://www.cnblogs.com

双端队列

匿名 (未验证) 提交于 2019-12-02 23:51:01
双端队列 给出一个长度为n的数列 \(\{a_i\}\) ,从左至右进行操作,假设是对第i个数操作,你有以下选择 创建一个新的双端队列,并将 \(a_i\) 入队 入队一个已有的双端队列 最后需要满足所有的双端队列会有一种方案首尾相接形成一个新的数列,这个数列单调递增, \(n\leq 2\times 10^5\) 。 从答案的角度思考问题,最后的数列是一个单调递增的数列,双端队列类似这个数列中的一个一个区间,于是又像是一道区间划分问题,很快反应出这个问题的一个通用性质,也就是一般可以递推。 先构造数列 \(\{b_i\}\) ,令 \(b_i=a_i\) ,再把 \(\{b_i\}\) 按从小到大排序,构造一个 \(\{c_i\}\) , \(c_i\) 表示 \(b_i\) 在 \(\{a_i\}\) 中出现的位置。 现在我们就只要合法地将 \(\{b_i\}\) 划分成尽可能少的区间,于是根据 \(\{c_i\}\) ,我们发现把 \(i\) 作为自变量, \(c_i\) 作为因变量,那么此时形成一个有一个最低点,最低点两端的图像都是单调的,这一段区间就可以作为双端队列中的元素,如图。 注意到这是一个数列的问题,不妨总结一下数列问题的解决办法 从性质上看,一可以根据逆序对个数和奇偶性与问题的关系,二可以把 \(a_i\) 排序构造一个新的数列 \(\{b_i\}\)

deque

℡╲_俬逩灬. 提交于 2019-12-02 23:30:55
deque,全名double-ended queue 是一种具有队列和栈的性质的数据结构。 双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。 双端队列是限定插入和删除操作在表的两端进行的线性表。这两端分别称做端点1和端点2。 也可像栈一样,可以用一个铁道转轨网络来比喻双端队列。 在实际使用中,还可以有输出受限的双端队列(即一个端点允许插入和删除,另一个端点只允许插入的双端队列) 和输入受限的双端队列(即一个端点允许插入和删除,另一个端点只允许删除的双端队列)。 而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻的栈了。 尽管双端队列看起来似乎比栈和队列更灵活,但实际上在应用程序中远不及栈和队列有用。 deque 的调用(也可以手写)来自:https://www.cnblogs.com/liubilan/p/9461141.html 1 deque - 双向队列 2 1.构造 3 无参构造: 4 deque<int> a;  //<>内自定义数据类型; 5 带参构造: 6 deque(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。 7 deque(n,elem); //构造函数将n个elem拷贝给本身。 8 deque(const deque &deq); /

数据结构之栈和队列

纵然是瞬间 提交于 2019-12-02 14:46:40
栈和队列 栈 特性:先进后出的数据结构 应用:每个web浏览器都有一个返回按钮,当你浏览网页时,这些网页被放置在一个栈中(网页的网址)。你现在查看网页的地址存储在栈的顶部,你第一个查看网页的地址存储在栈的底部。如果按"返回"按钮,将按相反的顺序浏览刚才的页面。 栈的方法 Stack() 创建一个空的新栈。他不需要参数,返回创建的新栈 push(item)将一个新数据添加到栈的顶部,他需要item参数,并且不返回任何内容 pop() 从栈中删除顶部项,他不需要参数并返回item。栈被修改 peek() 从栈返回顶部项,但不会删除它,不需要参数,不修改栈 isEmpty() 测试栈是否为空。不需要参数,返回布尔值 size() 返回栈中item数量。不需要参数,并返回一个整数 python第三方库栈的实现 from pythonds.basic.stack import Stack s=Stack() #实例化创建一个栈 s.push("11") #向栈顶部放入数据 s.push("22") s.push("33") s.push("44") print(s.size()) #查看栈中有多少个元素 print(s.pop()) #取出栈顶部第一个元素 print(s.peek()) #返回栈顶第一个元素 print(s.isEmpty())#判断栈是否为空 自定义栈的实现 class

队列

ぐ巨炮叔叔 提交于 2019-12-02 02:20:09
一、概述 与栈相反,队列是先进先出(FIFO),后进后出的数据结构。插入的一端叫做队尾,而出去的一端则称为队头或队首。但是队列(Queue)有一种扩展形式,称为 双端队列(Deque) ,即可以在两端都进行插入和删除的操作,看起来双端队列似乎更加使用,但在实际应用中却并不常见。同样的,队列也有两种实现形式,即顺序队列和链队列。 来源: https://www.cnblogs.com/lbrs/p/11725673.html