Java Deque队列讲解和案例示范

第一部分:Deque类概述

Deque的定义与特性

Deque(Double-Ended Queue)是一种双端队列,可以在两端高效地插入和删除元素。与Queue和Stack相比,Deque提供了更多的灵活性,因为它支持在两端进行操作。

  • 特性:
    • 支持在队列的两端插入和删除元素。
    • 可以作为队列和栈的实现。
    • 可以存储null元素(在某些实现中)。
Deque与Queue和Stack的区别
  • Queue:只允许在一端插入,在另一端删除,遵循先进先出(FIFO)原则。
  • Stack:只允许在一端插入和删除,遵循后进先出(LIFO)原则。
  • Deque:既可以在头部也可以在尾部插入和删除元素,提供了更多灵活性。

第二部分:Deque的常见方法讲解

Deque类提供了一系列常用方法来操作双端队列,以下是一些常见的方法及其示例:

1. 添加元素的方法
  • addFirst(E e):在队列的头部添加元素。
  • addLast(E e):在队列的尾部添加元素。
Deque<String> deque = new ArrayDeque<>();
deque.addFirst("商品1");
deque.addLast("商品2");
2. 移除元素的方法
  • removeFirst():移除并返回队列的头元素。
  • removeLast():移除并返回队列的尾元素。
String first = deque.removeFirst(); // 返回"商品1"
String last = deque.removeLast();   // 返回"商品2"
3. 访问元素的方法
  • getFirst():获取队列的头元素但不移除。
  • getLast():获取队列的尾元素但不移除。
String head = deque.getFirst(); // 返回"商品1"
String tail = deque.getLast();   // 返回"商品2"
4. 迭代器的使用

Deque还支持迭代器的使用,可以遍历所有元素。

for (String item : deque) {System.out.println(item);
}

第三部分:Deque的使用示例

1. 购物车管理

购物车可以被视为一个Deque,用户可以随时添加、删除商品。

Deque<Product> cart = new ArrayDeque<>();
cart.addLast(new Product("商品1", 100));
cart.addLast(new Product("商品2", 200));
cart.removeFirst(); // 移除第一个商品
2. 浏览历史管理

用户在电商平台上的浏览历史可以使用Deque来管理,支持快速访问和删除。

Deque<Page> history = new ArrayDeque<>();
history.addLast(new Page("首页"));
history.addLast(new Page("商品详情"));
history.removeFirst(); // 删除最旧的页面
3. 订单处理

在订单处理系统中,Deque可以用于管理待处理订单。

Deque<Order> orders = new ArrayDeque<>();
orders.addLast(new Order(1, "用户1"));
orders.addLast(new Order(2, "用户2"));
Order nextOrder = orders.removeFirst(); // 处理下一个订单

第四部分:Deque的底层实现

Java中的Deque实现类

Java标准库提供了几个Deque的实现,主要包括:

  1. ArrayDeque
    • 实现:基于动态数组,支持双端插入和删除。
    • 优点:相较于LinkedList,ArrayDeque在内存使用上更加高效,插入和删除操作通常更快。
    • 缺点:容量有限,当数组满时,需要进行扩容,扩容时会复制原数组,性能会受到影响。
  2. LinkedList
    • 实现:基于链表,支持任意数量的元素。
    • 优点:支持动态扩展,插入和删除操作在链表的任意位置都很高效。
    • 缺点:每个元素都需要额外的内存存储指针,因此在内存使用上不如ArrayDeque高效。
ArrayDeque与LinkedList的比较
特性ArrayDequeLinkedList
内存使用更少(动态数组)更多(每个节点额外指针)
插入/删除操作复杂度O(1)(平均情况下)O(1)
随机访问复杂度O(1)O(n)
扩容需要复制数组动态扩展
内存使用与性能分析
  • ArrayDeque:在大多数情况下,ArrayDeque由于内存连续,能够提供更好的缓存局部性,导致更快的访问速度。
  • LinkedList:虽然支持动态大小,但由于内存的非连续性,频繁的内存分配和垃圾回收会影响性能。

第五部分:Deque与算法问题

Deque在解决某些经典算法问题时非常有用,以下是几个具体问题的示例:

1. 滑动窗口最大值问题

问题描述:给定一个整数数组和窗口大小k,找到每个滑动窗口的最大值。

代码示范

import java.util.*;public class SlidingWindowMax {public int[] maxSlidingWindow(int[] nums, int k) {if (nums.length == 0) return new int[0];int[] result = new int[nums.length - k + 1];Deque<Integer> deque = new ArrayDeque<>();for (int i = 0; i < nums.length; i++) {// 移除不在窗口中的元素if (!deque.isEmpty() && deque.peekFirst() == i - k) {deque.pollFirst();}// 移除比当前元素小的所有元素while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {deque.pollLast();}deque.addLast(i);// 记录当前窗口的最大值if (i >= k - 1) {result[i - k + 1] = nums[deque.peekFirst()];}}return result;}public static void main(String[] args) {SlidingWindowMax swm = new SlidingWindowMax();int[] nums = {1, 3, -1, -3, 5, 3, 6, 7};int k = 3;int[] result = swm.maxSlidingWindow(nums, k);System.out.println(Arrays.toString(result)); // 输出:[3, 3, 5, 5, 6, 7]}
}
2. 最小栈问题

问题描述:设计一个支持push、pop、top和retrieving the minimum element的栈。

代码示范

class MinStack {private Deque<Integer> stack;private Deque<Integer> minStack;public MinStack() {stack = new ArrayDeque<>();minStack = new ArrayDeque<>();}public void push(int x) {stack.addLast(x);// 如果当前元素小于或等于最小元素,更新最小栈if (minStack.isEmpty() || x <= minStack.peekLast()) {minStack.addLast(x);}}public void pop() {int value = stack.removeLast();// 如果弹出的是当前最小元素,更新最小栈if (value == minStack.peekLast()) {minStack.removeLast();}}public int top() {return stack.peekLast();}public int getMin() {return minStack.peekLast();}public static void main(String[] args) {MinStack minStack = new MinStack();minStack.push(5);minStack.push(3);minStack.push(7);System.out.println(minStack.getMin()); // 输出:3minStack.pop();System.out.println(minStack.getMin()); // 输出:3minStack.pop();System.out.println(minStack.getMin()); // 输出:5}
}
复杂度分析
  • 滑动窗口最大值问题:每个元素最多被添加和移除一次,因此时间复杂度为O(n),空间复杂度为O(k)。
  • 最小栈问题:所有操作的时间复杂度均为O(1),空间复杂度为O(n),因为存储了所有元素及其最小值。

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

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

相关文章

STM32中断——外部中断

目录 一、概述 二、外部中断&#xff08;Extern Interrupt简称EXTI&#xff09; 三、实例-对射式红外传感器 1、配置中断&#xff1a; 2 、完整代码 一、概述 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件(中断源)&#xff0c;使得CPU暂停当…

【图论】树剖(上):重链剖分

一、前置知识清单 深度优先搜索DFS 点我复习图的存储 复习链接敬请期待树状数组 点我复习 二、树剖简介 树剖&#xff08;树链剖分&#xff09;&#xff0c;是一种把树划分成链的算法&#xff0c;该算法分为重链剖分和长链剖分。 本文仅讨论重链剖分&#xff0c;长链剖分目前…

MySQL联合索引、索引下推Demo

1.联合索引 测试SQL语句如下&#xff1a;表test中共有4个字段(id, a, b, c)&#xff0c;id为主键 drop table test;#建表 create table test(id bigint primary key auto_increment,a int,b int,c int )#表中插入数据 insert into test(a, b, c) values(1,2,3),(2,3,4),(4,5,…

算法修炼之路之滑动窗口

目录 一&#xff1a;滑动窗口的认识及模板 二&#xff1a;LeetcodeOJ练习 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 一&#xff1a;滑动窗口的认识及模板 这里先通过一道题来引出滑动窗口 LeetCode 209 长度最小的子数组 画图分析&…

aws(学习笔记第一课) AWS CLI,创建ec2 server以及drawio进行aws画图

aws(学习笔记第一课) 使用AWS CLI 学习内容&#xff1a; 使用AWS CLI配置密钥对创建ec2 server使用drawio&#xff08;vscode插件&#xff09;进行AWS的画图 1. 使用AWS CLI 注册AWS账号 AWS是通用的云计算平台&#xff0c;可以提供ec2&#xff0c;vpc&#xff0c;SNS以及clo…

使用 Python 遍历文件夹

要解决这个问题&#xff0c;使用 Python 的标准库可以很好地完成。我们要做的是遍历目录树&#xff0c;找到所有的 text 文件&#xff0c;读取内容&#xff0c;处理空行和空格&#xff0c;并将处理后的内容合并到一个新的文件中。 整体思路&#xff1a; 遍历子目录&#xff1…

2.3MyBatis——插件机制

2.3MyBatis——插件机制 1.基本用法2.原理探究2.1加载过程2.2执行过程2.2.1 插件的执行点2.2.2 SQL执行的几个阶段2.2.3 如何梳理出执行流程 插件机制是一款优秀框架不可或缺的组成部分&#xff0c;比如spring、dubbo&#xff0c;还有我们要聊的Mybatis等等。所谓插件&#xff…

vSAN02:容错、存储策略、文件服务、快照与备份、iSCSI

目录 vSAN容错条带化存储策略1. 创建新策略2. 应用存储策略 vSAN文件服务文件服务快照与备份 vSAN iSCSI目标服务 vSAN容错 FTT&#xff1a;Fault to Tolerance 允许故障数 故障域&#xff1a;每一台vSAN主机是一个故障域 - 假设3台超融合&#xff08;3计算1存储&#xff09;&…

力扣 简单 110.平衡二叉树

文章目录 题目介绍解法 题目介绍 解法 平衡二叉树:任意节点的左子树和右子树的高度之差的绝对值不超过 1 //利用递归方法自顶向下判断以每个节点为根节点的左右子树的最大深度是否大于1 class Solution {public boolean isBalanced(TreeNode root) {if(root null){return tr…

基于Java的GeoTools对Shapefile文件属性信息深度解析

目录 前言 一、Shapefile的属性列表信息 1、属性表格信息 2、属性表格包含的要素 二、GeoTools对属性表格的解析 1、常规解析方法 2、基于dbf文件的属性信息读取 三、总结 前言 ESRI Shapefile&#xff08;shp&#xff09;&#xff0c;或简称shapefile&#xff0c;是美…

【Spring Boot React】Spring Boot和React教程 完整版

【Spring Boot & React】Spring Boot和React教程 在B站找到一个不错的SpringBoot和React的学习视频&#xff0c;作者是amigoscode 【Spring Boot & React】Spring Boot和React教程 2023年更新版【Spring Boot React】价值79.9美元&#xff0c;全栈开发&#xff0c;搭…

如何使用CMD命令启动应用程序(二)

说明&#xff1a;去年1024发布了一篇博客&#xff0c;介绍如何使用CMD命令启动应用程序&#xff0c;但实际情况&#xff0c;有些程序可能无法用配置环境变量的方式来启动&#xff0c;本文针对两种情况下的程序&#xff0c;如何使用CMD命令来启动&#xff0c;算是对上一篇博客的…

Qt操作主/从视图及XML——实例:汽车管理系统

目录 1. 主界面布局2.连接数据库3.主/从视图应用 1. 主界面布局 先创建一个QMainwindow&#xff0c;不带设计界面 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QGroupBox> #include <QTableView> #include <QListWidg…

鸿蒙harmonyos next flutter混合开发之开发plugin(获取操作系统版本号)

创建Plugin为my_plugin flutter create --org com.example --templateplugin --platformsandroid,ios,ohos my_plugin 创建Application为my_application flutter create --org com.example my_application flutter_application引用flutter_plugin&#xff0c;在pubspec.yam…

如何解决 MySQL ERROR 1040 (08004): Too many connections ?

MySQL 是最流行的开源关系数据库管理系统之一&#xff0c;它也是开发人员中非常常用的数据库。即便它高度健壮和可伸缩性极强&#xff0c;像任何软件一样&#xff0c;它也可能出现错误。我们会经常遇到一个错误&#xff0c;特别是在高流量系统中&#xff0c;error 1040 (08004)…

51c视觉~CV~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/11668984 一、 CV确定对象的方向 介绍如何使用OpenCV确定对象的方向(即旋转角度&#xff0c;以度为单位)。 先决条件 安装Python3.7或者更高版本。可以参考下文链接&#xff1a; https://automaticaddison.com/how-to-s…

阳台山足球营地的停车位探寻

阳台山足球营地的环境是真好哈。停车场名称&#xff1a;阳台山森林公园配套停车场。应该很多爬山的人车子也停在这里。而且我没想到的&#xff0c;阳台山的山泉水还有不少居民每天提着空桶去山上装。看来环境是真的很好哈 停车场有地面和地下停车场&#xff0c;停车位个数查不…

java 数据存储方式

1. 变量存储 这是最基本的数据存储方式&#xff0c;通过声明变量来存储数据。变量可以是基本数据类型&#xff08;如int、float、char等&#xff09;&#xff0c;也可以是引用数据类型&#xff08;如对象、数组等&#xff09;。变量存储的数据通常存储在内存中&#xff0c;随着…

【记录】Excel|Excel 打印成 PDF 页数太多怎么办

【记录】Excel&#xff5c;解决 Excel 打印成 PDF 页数过多的问题 文章目录 【记录】Excel&#xff5c;解决 Excel 打印成 PDF 页数过多的问题方法一&#xff1a;调整页边距WPS OfficeMicrosoft Excel 方法二&#xff1a;优化页面布局调整列宽和行高使用“页面布局”视图合并单…

python全栈开发是什么?

全栈指掌握多种技能&#xff0c;并能利用多种技能独立完成产品。通俗的说就是与这项技能有关的都会&#xff0c;都能独立完成。 python&#xff0c;因为目前很火&#xff0c;能开发的项目很多。例如&#xff1a;web前端后端&#xff0c;自动化运维&#xff0c;软件、小型游戏开…