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。

 

 

【AI智能体】Coze 搭建个人旅游规划助手实战详解 本文将详细介绍如何使用Coze平台搭建个人旅游规划助手。首先概述了AI智能体如何简化传统复杂任务的开发流程,然后重点介绍了Coze工作流的作用和核心节点类型(包括大模型、插件、知识库等)。通过实际操作演示,从创建智能体到配置多级工作流,逐步实现旅游规划功能:解析用户输入时间地点、查询必玩景点、获取景点详细信息等。该教程展示了如何利用Coze的可视化编排能力,即使非技术人员也能快速构建专业级AI应用。最终呈现的旅游助手可提供天气查询、行程建议等一站式服务。 阅读详情

相关推荐

迷茫之后:Java研发转型售前——选择大于努力!

写下这段文字的时候,小弟已经从Java开发岗位转型软件售前近20天了........ 2011年9月毕业于某培训机构,学的是java语言。之后来到深圳,进入华为外包开始了我的程序猿生涯....刚入职场,第一份工作总是兴奋情绪占主导地位,加入文思创新在华为的人力外包项目组,然后跟着老员工学习、修复小bug,一步一坑的去熟悉那老掉牙的框架...ejb+struts1.2.........项目组老

xuweiwei0415的专栏 1万+

【Java】Stack和Deque

Deque替代Stack

RiceVan的博客 2130

转义序列字符(\0,\n,\r,\t,\v,\a,\f,\b,\\,\‘,\“,\?)详解,转义字符对应的全称,输出结果和对应的ASCII码值详解;

转义序列字符(\0,\n,\r,\t,\v,\a,\f,\b,\\,\',\",\?)详解,转义字符对应的全称,输出结果和对应的ASCII码值详解;

南城花开过的博客 3万+

java中的栈Stack与Deque

java中的栈Stack与Deque

qq_53373885的博客 775

iStore增强插件 如何重塑家庭网络与存储体验

本文深入解析了iStore增强插件如何重塑家庭数字生活体验。它通过集成智能流控、一键式文件共享、媒体服务器及智能家居网关等功能,将复杂的网络配置、存储管理与设备协同简化为图形化操作,有效解决了家庭网络卡顿、数据割裂与使用门槛高等核心痛点,让普通用户也能轻松打造高效、稳定、安全的家庭数字中枢。

prometheus9mon的博客 648

同步调相机启动与并网控制技术方案

同步调相机起动与并网控制技术方案采用背靠背变流器系统,通过静止变频器(SFC)策略实现无原动机驱动的同步电机从静止到同步转速的平稳起动。方案详细阐述了硬件自检、模块初始化、转子位置检测等关键环节,重点解决启动转矩为零、冲击电流大等挑战。系统基于STM32或C2000系列控制器,包含网侧/机侧变流器、检测保护单元及通信接口,通过励磁脉冲和电压响应分析实现高精度转子初始定位,为后续并网提供必要条件。代码级实现涵盖了ADC自检、数字IO验证及通信端口测试等核心功能。

huanghm88的专栏 306

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

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

lph159的博客 2370

基于GEC6818开发板+Linux+Qt设计的智能养老院出入管理系统(195)

当前,传统的养老院出入管理模式普遍存在信息更新滞后、数据统计繁琐、实时监控能力不足等问题,难以满足现代养老机构对安全管理与服务质量提升的需求。本系统设计正是针对这些问题,通过集成先进的硬件设备如高性能GEC6818开发板以及RFID刷卡模块,结合稳定高效的嵌入式Linux操作系统和QT开发框架,构建一套功能齐全、操作直观、响应迅速的智能出入管理系统。 该系统能自动记录并实时显示老人的进出时间,方便管理人员及时了解每位老人的活动轨迹,同时具备强大的后台管理功能,支持管理员便捷地进行老人信息的增删改查操作。通

1069

Java容器之Stack和Deque

Java容器之Stack和Deque。

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

ESP32设备驱动-TM1637-驱动4位7段数码管

TM1637是一款带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成了MCU数字接口、数据锁存、LED高压驱动、键盘扫描等功能。 TM1637使用DIP20/SOP20封装,主要适用于电磁炉、微波炉、小家电的显示驱动。

视觉与物联智能 2117

从零构建Fama-French多因子模型:量化投资系统开发实战

本文详细介绍了如何从零构建Fama-French多因子模型,并将其应用于量化投资系统的开发。首先,文章概述了Fama-French多因子模型的背景、核心原理和架构,解释了其如何通过引入市场风险、规模、价值、盈利和投资等因子来解释股票收益率的变化。接着,文章详细阐述了构建该模型的具体步骤,包括因子的计算、因子暴露的确定以及模型的估计。通过数学模型和公式,文章对模型进行了理论推导,并举例说明了其应用。此外,文章还提供了项目实战的代码案例,从开发环境搭建到源代码实现,逐步指导读者完成量化投资系统的开发。最后,文章

2501_92132293的博客 1226

JAVA-栈Stack和Deque

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

Lizhihao_的博客 878

基于STM32L4XX、HAL库的AP6275S WIFI 模块驱动程序设计

支持802.11a/b/g/n/ac/ax (Wi-Fi 6)标准。// 这部分通常依赖于Broadcom提供的固件和驱动。// 这里需要添加Wi-Fi固件加载和初始化的代码。// 通常需要通过SDIO发送命令和接收响应。// 这里需要添加蓝牙HCI初始化代码。// 处理Wi-Fi和蓝牙数据。// 这里需要实现Wi-Fi连接逻辑。// 初始化SDIO和UART。// 确保蓝牙使能引脚已设置。// 关闭Wi-Fi和蓝牙。// 关闭Wi-Fi和蓝牙。// 打开Wi-Fi和蓝牙。// 初始化AP6275S。

zhusl6688的博客 277

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

C++STL系列

yusjushd的博客 1469

老版QQ原生表情gif动态

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Stack、Queue and Deque

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

2401_89521529的博客 827

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

STL中的stack、queue以及deque

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

weixin_50470247的博客 1548

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【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、付费专栏及课程。

余额充值