Stack Queue Deque

stack、queue、priority_queue、deque STL 阅读详情

Java 数据结构:

 

各数据结构复杂度:

Stack

First In Last Out  FILO 

删除的复杂度为什么是O(1) 而不是O(n) ?  ,数据结构不是链表么?

删除 末尾元素当然是 O(1);

证明:remove 随机元素 O(n)

public boolean remove(Object o) {
        return removeElement(o);
    }
  
public synchronized boolean removeElement(Object obj) {
        modCount++;
        int i = indexOf(obj);
        if (i >= 0) {
            removeElementAt(i);
            return true;
        }
        return false;
    }

public synchronized int indexOf(Object o, int index) {
        if (o == null) {
            for (int i = index ; i < elementCount ; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = index ; i < elementCount ; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

Heap

https://en.wikipedia.org/wiki/Heap_(data_structure)

heap 的实现方式:严格的 斐波那契堆 效率高一些。

 

Queue

First In First Out  FIFO

Deque  

https://www.cnblogs.com/bushi/p/6681543.html

一.概述

双向队列 FILO  and  FIFO

Deque是Queue的子接口,我们知道 Queue 是一种队列形式 ,而 Deque 则是双向队列,  它支持从两个端点方向检索和插入元素,因此Deque既可以支持LIFO形式也可以支持LIFO形式.Deque接口是一种比Stack和Vector更为丰富的抽象数据形式,因为它同时实现了以上两者.

二.主要方法

修饰符和返回值方法名描述
添加功能
voidpush(E)向队列头部插入一个元素,失败时抛出异常 
voidaddFirst(E)向队列头部插入一个元素,失败时抛出异常
void addLast(E)向队列尾部插入一个元素,失败时抛出异常
boolean offerFirst(E)向队列头部加入一个元素,失败时返回false
boolean offerLast(E)向队列尾部加入一个元素,失败时返回false
获取功能
EgetFirst()获取队列头部元素,队列为空时抛出异常
E getLast()获取队列尾部元素,队列为空时抛出异常
E peekFirst()获取队列头部元素,队列为空时返回null
E peekLast()获取队列尾部元素,队列为空时返回null
删除功能
booleanremoveFirstOccurrence(Object)删除第一次出现的指定元素,不存在时返回false
boolean removeLastOccurrence(Object)删除最后一次出现的指定元素,不存在时返回false
弹出功能
Epop()弹出队列头部元素,队列为空时抛出异常
EremoveFirst()弹出队列头部元素,队列为空时抛出异常
E removeLast()弹出队列尾部元素,队列为空时抛出异常
E pollFirst()弹出队列头部元素,队列为空时返回null 
E pollLast()弹出队列尾部元素,队列为空时返回null 
迭代器
Iterator<E>descendingIterator()返回队列反向迭代器

可以看出Deque在Queue的方法上新添了对队列头尾元素的操作,add,remove,get形式的方法会在有界队列满员和空队列时抛出异常,offer,poll,peek形式的方法则会返回false或null.

此外方法表中需要注意push = addFirst,pop = removeFirst,只是使用了不同的方法名体现队列表示栈结构时的特点.

三.实现

  同Queue一样Deque的实现也可以划分成通用实现和并发实现.

  通用实现主要有两个实现类ArrayDeque和LinkedList.

  ArrayDeque是个可变数组,它是在Java 6之后新添加的,而LinkedList是一种链表结构的list.LinkedList要比ArrayDeque更加灵活,因为它也实现了List接口的所有操作,并且可以插入null元素,这在ArrayDeque中是不允许的.

ArrayDeque 源码:
public void addLast(E e) {
    if (e == null)
        throw new NullPointerException();
    elements[tail] = e;
    if ( (tail = (tail + 1) & (elements.length - 1)) == head)
        doubleCapacity();
}

  从效率来看,ArrayDeque要比LinkedList在两端增删元素上更为高效,因为没有在节点创建删除上的开销.最适合使用LinkedList的情况是迭代队列时删除当前迭代的元素.此外LinkedList可能是在遍历元素时最差的数据结构,并且也LinkedList占用更多的内存,因为LinkedList是通过链表连接其整个队列,它的元素在内存中是随机分布的,需要通过每个节点包含的前后节点的内存地址去访问前后元素.

  总体ArrayDeque要比LinkedList更优越,在大队列的测试上有3倍与LinkedList的性能,最好的是给ArrayDeque一个较大的初始化大小,以避免底层数组扩容时数据拷贝的开销.

  LinkedBlockingDeque是Deque的并发实现,在队列为空的时候,它的takeFirst,takeLast会阻塞等待队列处于可用状态

 

LinkedList、ArrayQueue、PriorityQueue的原理和区别

LinkedList是List接口的实现类,是List集合,底层是一种链表的数据结构,可以根据索引来获取元素,增加或删除元素的效率较高,如果查找的话需要遍历整合集合,效率较低,LinkedList同时实现了stack、Queue、PriorityQueue的所有功能。

ArrayQueue是一个基于数组实现的队列,可以想象,在队列中存在两个指针,一个指向头部,一个指向尾部。

PriorityQueue是一个队列的实现类,此实现类中存储的元素排列并不是按照元素添加的顺序进行排列,而是内部会按元素的大小顺序进行排列,是一种能够自动排序的队列。

 

如果你的程序强调对元素的增、删、改、查、遍历等操作就用LinkedList或者ArrayList;

如果是强调对象进入容器和对象从容器出来时的先后关系,那就用Stack、Queue、PriorityQueue。

 

 

行车记录仪 - 碰撞检测 功能需求 行车记录仪的核心功能是记录,大部分时候,行车记录仪都是在循环录制视频和音频,而设备的存储空间是有限的,因此录制机制一般是循环覆盖录制,如此一些重要的记录(例如:发生碰撞时的记录)就可能会被覆盖,为了避免这种情况的发生,行车记录仪设备就需要感知这些情况并做特殊处理(例如:备份相应时刻的录像数据)。 实现原理 碰撞检测是通过物理芯片G-sensor来实现的,加速度发生变化时G-sensor驱动会将加速度上报给应用层,应用层做相应处理。 G-sensor G-sensor(Gravity se 阅读详情

相关推荐

开源libmodbus编译为32位和64位动态库

libmodbus 是支持Linux,Mac OS X,window 的一个开源库,支持modbus TCP和RTU 两种模式。

lemontree1945的博客 1923

【Java】Stack和Deque

Deque替代Stack

RiceVan的博客 2130

sql server安装并SSMS连接

  SQL Server是一种广泛应用于网络业务数据处理的关系型数据库管理系统。SQL Server 2016是微软公司研发的新一代旗舰级数据库和分析平台,突出高级分析和丰富可视化,并融合了关键创新功能。其可提供对企业基础架构最高级别的支持,专门针对关键业务应用的多种功能与解决方案提供最高级别的可用性,并提供更多、更全面的功能以满足不同人群对数据的需求,包括支持来自不同网络环境的数据交互、全面的自助分析等创新功能。百度搜索sql server,在官网下载 地址是:SQL Server 下载| Microso

jiankang66的博客 5184

java中的栈Stack与Deque

java中的栈Stack与Deque

qq_53373885的博客 775

FPGA波束形成:从算法到硬件的艺术之旅

本文深入探讨了FPGA在波束形成技术中的应用,从算法原理到Verilog硬件实现的全过程。文章详细分析了FPGA并行处理、低延迟和可重构特性如何优化波束形成系统性能,并提供了Verilog关键模块代码示例和资源优化策略,为工程师实现高效FPGA波束形成解决方案提供实用指导。

tea88的博客 1044

图相似度模型(论文篇)

图相似度模型

weixin_43702653的博客 5748

探索Java中的栈:Stack与Deque(ArrayDeque和LinkedList)

在Java中,栈可以通过Stack类来实现。Stack类是Java集合框架的一部分,它实现了一个后进先出(LIFO)的数据结构。Stack;双端队列(Deque)是一种更加通用的数据结构,它同时支持在队列两端进行插入和删除操作。在Java中,Deque是一个接口,它有多种实现方式,如ArrayDeque、LinkedList等。

lph159的博客 2370

【WRFDA第一期】WRF数据同化概述及资源整理

【WRFDA第一期】WRF数据同化概述及资源整理

WW、forever的博客 1658

Java容器之Stack和Deque

Java容器之Stack和Deque。

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 963

RAGFlow 系列教程 第14课:GraphRAG -- 知识图谱增强检索

RAGFlow v0.25.0深度解读了GraphRAG技术,通过构建知识图谱解决传统RAG在多跳推理问题上的局限。系统支持General GraphRAG和Light GraphRAG两种实现,包含四阶段构建流程:实体关系抽取、实体消解、社区检测和图持久化。核心代码位于rag/graphrag目录,采用LLM驱动的抽取机制,结合编辑距离和LLM确认的实体消解策略,以及Leiden社区检测算法。KGSearch模块通过多信号融合检索(实体+关系+N-hop+社区)实现高效查询。该系统将非结构化文本转化为可推

weixin_43674738的博客 101

企业 IoT 产品安全渗透测试与欧盟 CRA 合规落地实战指南

欧盟 CRA(网络弹性法案)2026-09-11 漏洞报告义务生效,2027-12-11 全面强制产品安全不再是"加分项",而是市场准入的法律门槛本文面向 IoT 企业安全工程师/运维工程师,讲清楚如何从零建立渗透测试能力,并与 CRA 合规要求对齐落地。不讲空话,全是可执行的步骤。IoT 企业安全工程师、运维工程师负责产品合规的技术人员想从"被动响应"转向"主动安全"的团队[ ] 能独立完成 Web 应用渗透测试并输出报告[ ] 能对 REST/GraphQL API 进行安全评估。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 269

JAVA-栈Stack和Deque

进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。LIFO(Last In First Out)的原则。栈:一种特殊的线性表,其。压栈:栈的插入操作叫做进栈/压栈/入栈,说这么多其实就是一个数组,只要用。出栈:栈的删除操作叫做出栈。

Lizhihao_的博客 878

C# 开发实战:深度解析 13.56MHz 射频卡读写应用

本文详细介绍了如何在 C# 环境下开发 13.56MHz 射频卡的读写应用。通过 ACR122U 作为硬件设备,结合 C# 提供的 COM 组件或 SDK,我们能够实现对射频卡的读取与写入功能。在实际开发中,开发者还需要根据具体应用场景选择合适的卡片类型与设备,并注意性能优化和异常处理。随着技术的发展,RFID 技术的应用场景会越来越广泛,开发者可以根据不同需求,灵活扩展读写功能,实现更加智能化和自动化的系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1602

【C++】—— stack & queue & deque

C++STL系列

yusjushd的博客 1469

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Stack、Queue and Deque

1.适配器的概念: 封装一个已有对象,转换其接口 2.容器适配器: 封装一个已有容器对象,转换其容器对象的接口 3.容器适配器中没有迭代器 (1)行为约束,保证栈后进先出和队列先进先出行为 (2)安全保证,避免破坏内部结构,如:priority_queue的堆序性 4.适配器模式: 封装旧对象 + 接口转换层

2401_89521529的博客 827

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STL中的stack、queue以及deque

1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。empty:判空操作back:获取尾部元素操作push_back:尾部插入元素操作pop_back:尾部删除元素操作。

weixin_50470247的博客 1548

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【C++】stack|queue|deque

stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。判空操作获取尾部元素操作尾部插入元素操作尾部删除元素操作标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。

悟已往之不谏 知来者之可追 1242

【C++】stack与queue和deque

stack与queue的介绍使用和模拟实现,deque的了解及对比

关注学习C++领域,感谢陪伴,共同进步! 1644

深入探究C++ 中的stack、queue和deque

C++中 deque 的注意事项及示例:1. 迭代器失效:在 deque 中插入或删除元素后,除了指向被删除元素的迭代器外,其他迭代器可能仍然有效,但可能会导致迭代器重新定位。cpp// 插入元素后,迭代器it仍然有效return 0;1. 容量和内存管理: deque 的内存管理相对复杂,它通过分段连续内存实现。与 vector 相比, deque 在头部插入和删除元素更高效,因为不需要移动大量元素来调整内存。cppi < 10;++i) {

nplplus的博客 1632

【C++】:stack、queue和deque全面讲解

本文介绍了C++标准库中的三种容器适配器:stack、queue和deque。stack是后进先出(LIFO)结构,queue是先进先出(FIFO)结构,二者都是通过封装底层容器实现功能。文章详细讲解了它们的使用方法、模拟实现,并分析了其优缺点。deque作为双端队列,是stack和queue的默认底层容器,文章解释了其分段存储结构、迭代器实现以及为何被选为默认容器的原因。通过对比vector和list的特性,说明了deque在两端操作效率与内存利用率上的平衡优势。

qq_58135952的博客 924

C++番外篇——stack、queue的实现及deque的介绍

详细介绍deque,用vector、list与STL中分别模拟实现栈和队列,解析他们之间的区别及优缺点

weixin_73629886的博客 1240

java 中的Stack、Queue、Deque

1.Stack java集合框架中没有Stack接口,仅仅有java早期遗留下来的一个Stack类。 Java.util.Stackpublic Stack extends Vector 因为集成自Vector,所以Stack类是同步的,效率不高。官方一般建议这样使用ArrayDeque代替Stack Deque stack = new ArrayDeque(); 2.Queue

知之可否 1万+

stack,queue与deque

STL中的stac和queuek是通过容器适配器来实现的,并不是直接实现栈。那什么是容器适配器呢?举一个简单的例子,不同的插座需要不同的插头来连接,这时候我们用一个插座适配器,我们就不需要关心自己本身的插头,相当于加了一层中间层。在STL中stack和queue就像适配器一样,只是对其他容器的接口进行封装,例如stack和queue在STl中就是用deque进行封装。这里我的private内容是一个模板,用来传容器类型例如vector,list这样的。函数构造时会直接走private部分。

2401_86449430的博客 603

stack、queue(priority_queue)的模拟实现和deque的简单介绍

stack,queue,priority_queue,deque

想学好c++的oMen的博客 999

【C++】STL中stack、queue、deque的使用

在C++中,deque(双端队列)是一种线性容器,允许在两端进行插入和删除操作。deque是 “double-ended queue” 的缩写。deque类似于vector,但不同之处在于deque允许在容器的前端和后端进行高效的插入和删除操作,而vector只支持在末尾进行插入和删除操作。deque还提供了随机访问元素的能力,类似于数组。deque的主要特点包括:在两端进行高效的插入和删除操作。随机访问元素的能力。动态分配存储空间,自动扩展和收缩容量。

m0_64826370的博客 916

stack和queue的使用和模拟实现以及了解deque

stack和queue的使用和模拟实现以及了解deque

2402_89035880的博客 847
上一篇: PriorityQueue 解析
下一篇: bat去掉字符串前后空格
阿杰、
博客等级 码龄11年 13粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值