双端队列Deque

news2024/9/22 3:55:34

Deque(双端队列)是一种允许在两端都进行插入和删除操作的线性数据结构。它在 Java Collections Framework 中作为一个重要的接口,具有以下结构特点:

1. 双端操作

  • 两端插入和删除:与传统队列(只能在一端入队,一端出队)不同,Deque允许在两端(头部和尾部)同时进行插入和删除操作。这使得它既可以用作栈(后进先出,LIFO),也可以用作队列(先进先出,FIFO)。

2. 灵活性和多样性

  • 多用途:由于其双端特性,Deque可以用于多种应用场景,例如任务调度、回溯算法、浏览器历史记录等。开发者可以选择不同的操作模式来满足具体需求。

3. 实现方式

  • 多种实现:Java 中提供了多种 Deque 的实现,最常见的是 ArrayDeque 和 LinkedList
    • ArrayDeque:基于动态数组实现,提供更高效的访问和搜索,但会在频繁扩展时出现性能瓶颈。
    • LinkedList:基于双向链表实现,适合进行频繁插入和删除操作,特别是在中间或两端进行操作时。

4. 无容量限制

  • 动态大小Deque 的大小可以动态改变,理论上只受限于系统内存。这意味着你不需要预先指定容量,可以根据需要添加任意数量的元素(除非达到 JVM 内存限制)。

5. 访问性能

  • 常数时间复杂度Deque 的插入和删除操作通常是常数时间复杂度 O(1),使得它在执行高频率操作时表现良好。
  • 随机访问:虽然不支持直接索引(如数组或普通列表),但可以通过迭代器或其他方法访问元素。

6. 接口特性

  • 集合框架的一部分Deque 接口是 Java Collections Framework 的一部分,继承自 Collection 接口,并实现了 Queue 接口。这意味着它可以与 Java 的其他集合结构很好地兼容。

7. 线程安全性

  • 非线程安全Deque 的实现(如 ArrayDeque 和 LinkedList)通常不是线程安全的。如果需要在多线程中使用,必须通过外部同步机制来保证线程安全。

总结

Deque 作为一个灵活且功能强大的数据结构,因其双端操作的特性,适用于广泛的场景。它的高效性能使得它在实际开发中被广泛应用,是许多算法和数据结构实现的基础。

下面是基于 LinkedList 实现的 Deque 的示例,展示如何将 LinkedList 用作栈(LIFO)和队列(FIFO)。

1. 使用 LinkedList 实现 Deque

首先,确保导入必要的包:

2. 使用 LinkedList 作为栈

我们可以使用 LinkedList 来实现栈的基本操作(后进先出)。

栈示例代码:
import java.util.LinkedList;
import java.util.Deque;

public class LinkedListAsStack {
    public static void main(String[] args) {
        Deque<Integer> stack = new LinkedList<>();

        // 入栈
        stack.push(1);
        stack.push(2);
        stack.push(3);

        // 出栈
        System.out.println("出栈: " + stack.pop());  // 输出 3
        System.out.println("栈顶元素: " + stack.peek()); // 查看栈顶元素,输出 2
        System.out.println("出栈: " + stack.pop());  // 输出 2
        System.out.println("出栈: " + stack.pop());  // 输出 1
    }
}

3. 使用 LinkedList 作为队列

同样,我们可以使用 LinkedList 来实现队列的基本操作(先进先出)。

队列示例代码:
public class LinkedListAsQueue {
    public static void main(String[] args) {
        Deque<Integer> queue = new LinkedList<>();

        // 入队
        queue.addLast(1);      // enqueue
        queue.addLast(2);
        queue.addLast(3);

        // 出队
        System.out.println("出队: " + queue.removeFirst()); // 输出 1
        System.out.println("队头元素: " + queue.peekFirst()); // 查看队头元素,输出 2
        System.out.println("出队: " + queue.removeFirst()); // 输出 2
        System.out.println("出队: " + queue.removeFirst()); // 输出 3
    }
}

Summary

  • 作为栈

    • 使用 push() 方法添加元素到栈顶。
    • 使用 pop() 方法从栈顶移除元素,返回被移除的元素。
    • 使用 peek() 方法查看栈顶元素但不移除。
  • 作为队列

    • 使用 addLast() 方法将元素添加到队列尾部。
    • 使用 removeFirst() 方法从队列头部移除元素并返回它。
    • 使用 peekFirst() 方法查看队头元素但不移除。

由于 LinkedList 的双向链表特性,它能够高效地完成这些操作,而其动态扩展的特性使得在使用时更加灵活。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1995160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

迭代次数顺序的双重性

(A,B)---6*30*2---(0,1)(1,0) 收敛误差为7e-4&#xff0c;收敛199次取迭代次数平均值&#xff0c; 让A是4a1&#xff0c;4a2&#xff0c;…&#xff0c;4a16&#xff0c;B全是0得到迭代次数的顺序就是1&#xff0c;2&#xff0c;…&#xff0c;16. 但是如果让训练集A-B矩阵的高…

kafka-go使用:以及kafka一些基本概念说明

关于kafka 作为开发人员kafka中最常关注的几个概念&#xff0c;是topic,partition和group这几个概念。topic是主题的意思&#xff0c;简单的说topic是数据主题&#xff0c;这样解释好像显得很苍白&#xff0c;只是做了个翻译。一图胜前言&#xff0c;我们还是通过图解来说明。…

PDF密码移除技巧: 五大 PDF 密码移除器

如果您想解密或删除 PDF 密码&#xff0c;该怎么办&#xff1f;PDF 是一种经常用于商业的格式&#xff0c;您可以在培训、教育和商业场合使用它。添加这些 PDF 文件的密码可以保护您的安全和隐私。因此&#xff0c;有很多 PDF 都用密码加密&#xff0c;当您想要查看这些 PDF 时…

PTrade常见问题系列22

反馈定义的上午7点执行run_daily函数&#xff0c;但是每周一上午都没法正常执行&#xff1f; 1、run_daily函数加载在initialize函数中&#xff0c;执行后才会创建定时任务&#xff1b; 2、由于周末会有例行重启操作&#xff0c;在重启以后拉起交易时相当于非交易日启动的交易…

【人工智能训练师】2 集群搭建

题目一、基础配置 core-site.xml参数配置详情 官方文档&#xff1a;http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/core-default.xml core-default.xml与core-site.xml的功能是一样的&#xff0c;如果在core-site.xml里没有配置的属性&#xff0c…

【C++二分查找 决策包容性】1300. 转变数组后最接近目标值的数组和

本文涉及的基础知识点 C二分查找 决策包容性 LeetCode1300. 转变数组后最接近目标值的数组和 给你一个整数数组 arr 和一个目标值 target &#xff0c;请你返回一个整数 value &#xff0c;使得将数组中所有大于 value 的值变成 value 后&#xff0c;数组的和最接近 target …

【开端】JAVA中的切面使用

一、绪论 在不使用过滤器和 拦截器的前提下&#xff0c;如果统一对JAVA的 方法进行 管理。比如对一类方法或者类进行日志监控&#xff0c;前后逻辑处理。这时就可以使用到切面。它的本质还是一个拦截器。只是通过注解的方式来标识所切的方法。 二、JAVA中切面的使用实例 Aspec…

如何看待“低代码”开发平台的兴起

目录 1.概述 1.1.机遇 1.2.挑战 1.3.对开发者工作方式的影响 2.技术概览 2.1.主要特点 2.2.市场现状 2.3.主流低代码平台 2.4.分析 3.效率与质量的权衡 3.1.提高开发效率 3.2.质量与安全隐患 3.3.企业应用开发的利弊分析 4.挑战与机遇 4.1.机遇 4.2.挑战 4.3.…

为什么需要在线实时预览3D模型?如何实现?

在线实时预览3D模型在现代设计、产品开发、市场营销、以及娱乐等领域中变得越来越重要&#xff0c;原因可以归结为以下几个方面&#xff1a; 1、多平台兼容性&#xff1a; 在线实时预览通常不依赖于特定的操作系统或软件平台&#xff0c;只要设备能够访问互联网和浏览器&…

21-原理图的可读性的优化处理

1.自定义原理图尺寸 先将原理图移动到左下角 2.划分模块 3.放置模块字符串

第三期书生大模型实战营——基础岛

1.书生大模型全链路开源体系 【书生浦语大模型全链路开源开放体系】 https://www.bilibili.com/video/BV18142187g5/?share_sourcecopy_web&vd_source711f676eb7f61df7d2ea626f48ae1769 视频里介绍了书生浦语大模型的开源开放体系&#xff0c;包括了其的技术发展、模型架…

ubuntu系统下安装LNMP集成环境的详细步骤(保姆级教程)

php开发中集成环境的安装是必不可少的技能,而LNMP代表的是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。今天就给大家分享下LNMP的安装步骤。 1 Nginx安装 在安装Nginx前先执行下更新命令: sudo apt-get update 接下来开始安装Nginx, 提示:Could not get lock /v…

【mysql 第二篇章】请求到真正执行 SQL 到底是一个怎么样的过程?

从用户调用到SQL执行的流程中间发生了什么事情 1、网络请求使用 线程 来处理&#xff0c;当数据库连接池中监听到有连接请求&#xff0c;这个时候会分配一个线程来处理。 2、SQL接口 负责接收 SQL 语句&#xff0c;当线程监听到有请求和读取数据的之后&#xff0c;将 SQL 语句…

Android Fragment:详解,结合真实开发场景Navigation

目录 1&#xff09;Fragment是什么 2&#xff09;Fragment的应用场景 3&#xff09;为什么使用Fragment? 4&#xff09;Fragment如何使用 5&#xff09;Fragment的生命周期 6&#xff09;Android开发&#xff0c;建议是多个activity&#xff0c;还是activity结合fragment&…

SparkSQL——AnalyzedLogicalPlan生成

Rule和RuleExecutor SparkSQL中对LogicalPlan的解析、优化、还有物理执行计划生成都是分成一个个Rule进行的。 RuleExecutor是一个规则引擎&#xff0c;它收集Rule&#xff0c;并对plan按照rule进行执行。 每一个Rule的实现类都要实现apply方法&#xff0c;具体逻辑都放在这个…

mysql中的时间相关函数

MySQL服务器中有3种时区设置&#xff1a; 系统时区&#xff08;保存在system_time_zone系统变量中&#xff09;服务器时区&#xff08;保存在全局系统变量time_zone中&#xff09;每个客户端连接的时区&#xff08;保存在会话变量time_zone中&#xff09; 其中&#xff0c;客…

极米RS10Plus性价比高吗?7款4-6K价位投影仪测评哪款最好

通常家庭想买个投影仪都会选择4-6K这个价位段的投影仪&#xff0c;3K以下的投影配置太低&#xff0c;6K以上的价格略高&#xff0c;4-6K价位段的中高端投影仪正好满足大部分家庭的使用需求。正好极米投影在8月份上新了一款Plus版本的长焦投影&#xff1a;极米RS10Plus&#xff…

剪切走的照片找回:数据恢复实战指南

一、引言&#xff1a;当珍贵瞬间遭遇剪切失误 在数字化时代&#xff0c;照片不仅是记忆的载体&#xff0c;更是情感与故事的传承。然而&#xff0c;一次不经意的剪切操作失误&#xff0c;却可能让这些珍贵的瞬间面临丢失的风险。面对剪切走的照片&#xff0c;许多用户会感到无…

AI看奥运 | 从巴黎奥运会看人工智能的应用和发展

2024巴黎奥运会火热空前&#xff0c;从开幕式到金牌争夺战&#xff0c;本届奥运会的关注热度持续攀升。与往届不同的是&#xff0c;本届奥运会不仅是首次在体育场馆外举办的户外开幕式的奥运会&#xff0c;同时也是在转播技术上首次广泛应用AI技术的奥运会&#xff0c;包括“时…

C++ 新特性 | C++20 常用新特性介绍

目录 1、模块(Modules) 2、协程(Coroutines) 3、概念(Concepts) 4、范围(Ranges) 5、三向比较符&#xff08;three-way comparison&#xff09; C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https…