当前位置: 首页 > news >正文

数据结构第08小节:双端队列

双端队列(deque,double-ended queue)是一种具有队列和栈特性的数据结构,允许在其两端进行插入和删除操作。在Java中,java.util.Deque接口就是双端队列的实现,而ArrayDequeLinkedList是其中的具体实现类。

下面是一个使用ArrayDeque实现的双端队列的例子,我们将使用它来管理一个在线购物车系统中的商品列表。用户可以从任何一端(前面或后面)添加或移除商品。

import java.util.ArrayDeque;
import java.util.Deque;// 商品类
class Product {String name;double price;public Product(String name, double price) {this.name = name;this.price = price;}@Overridepublic String toString() {return "Product{" +"name='" + name + '\'' +", price=" + price +'}';}
}public class ShoppingCart {private Deque<Product> cart;public ShoppingCart() {cart = new ArrayDeque<>();}// 向购物车尾部添加商品public void addProduct(Product product) {cart.addLast(product);}// 向购物车头部添加商品public void addFirstProduct(Product product) {cart.addFirst(product);}// 从购物车尾部移除商品public Product removeProduct() {return cart.pollLast();}// 从购物车头部移除商品public Product removeFirstProduct() {return cart.pollFirst();}// 显示购物车中的所有商品public void displayCart() {while (!cart.isEmpty()) {System.out.println(cart.pollFirst());}}public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();// 添加商品cart.addProduct(new Product("Apple iPhone 13", 999.99));cart.addFirstProduct(new Product("Google Pixel 6", 599.99));cart.addProduct(new Product("Samsung Galaxy S21", 799.99));// 显示购物车内容System.out.println("Shopping Cart Contents:");cart.displayCart();// 移除商品System.out.println("\nAfter removing the last item:");cart.removeProduct();cart.displayCart();// 再次移除商品System.out.println("\nAfter removing the first item:");cart.removeFirstProduct();cart.displayCart();}
}

在这个例子中:

  • Product 类表示商品,包含名称和价格属性。
  • ShoppingCart 类使用ArrayDeque作为内部数据结构来存储商品。它提供了添加商品到队列尾部或头部的方法,以及从队列尾部或头部移除商品的方法。
  • main 方法创建了一个ShoppingCart对象,添加了一些商品,显示了购物车的内容,然后移除了商品并再次显示购物车的内容。

这个例子展示了如何使用Java中的双端队列来管理一个购物车系统中的商品列表,允许用户从任意一端添加或移除商品,这在许多实际应用场景中都非常有用。

让我们通过一个详细的案例和表格来进一步说明如何使用双端队列(Deque)在Java中管理一个购物车系统。我们将使用ArrayDeque作为我们的双端队列实现,并跟踪购物车中的商品添加和移除操作。

示例代码

import java.util.ArrayDeque;
import java.util.Deque;// 商品类
class Product {String name;double price;public Product(String name, double price) {this.name = name;this.price = price;}@Overridepublic String toString() {return "Product{" +"name='" + name + '\'' +", price=" + price +'}';}
}public class ShoppingCart {private Deque<Product> cart;public ShoppingCart() {cart = new ArrayDeque<>();}// 向购物车尾部添加商品public void addProduct(Product product) {cart.addLast(product);}// 向购物车头部添加商品public void addFirstProduct(Product product) {cart.addFirst(product);}// 从购物车尾部移除商品public Product removeProduct() {return cart.pollLast();}// 从购物车头部移除商品public Product removeFirstProduct() {return cart.pollFirst();}// 显示购物车中的所有商品public void displayCart() {System.out.println("Current Cart Contents:");for (Product product : cart) {System.out.println(product);}}public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();// 添加商品到购物车cart.addProduct(new Product("Apple iPhone 13", 999.99));cart.addFirstProduct(new Product("Google Pixel 6", 599.99));cart.addProduct(new Product("Samsung Galaxy S21", 799.99));// 显示购物车内容cart.displayCart();// 移除商品System.out.println("\nAfter removing the last item:");cart.removeProduct();cart.displayCart();// 再次移除商品System.out.println("\nAfter removing the first item:");cart.removeFirstProduct();cart.displayCart();}
}

表格说明

购物车操作记录
操作描述购物车状态(从左至右为队首至队尾)
初始化创建一个空的购物车[]
添加到队尾(addLast)添加“Apple iPhone 13”[“Apple iPhone 13”]
添加到队首(addFirst)添加“Google Pixel 6”[“Google Pixel 6”, “Apple iPhone 13”]
添加到队尾(addLast)添加“Samsung Galaxy S21”[“Google Pixel 6”, “Apple iPhone 13”, “Samsung Galaxy S21”]
移除队尾(removeLast)移除“Samsung Galaxy S21”[“Google Pixel 6”, “Apple iPhone 13”]
移除队首(removeFirst)移除“Google Pixel 6”[“Apple iPhone 13”]

通过这个案例和表格,我们可以清楚地看到双端队列在购物车管理中的应用:商品可以被添加到队列的任一端,也可以从任一端移除。这种灵活性使得双端队列成为处理双向数据流或需要快速访问两端数据的场景的理想选择。

让我们继续深入探讨双端队列(Deque)的应用,这一次我们将使用它来解决一个常见的编程问题:回文检测。回文是指正读反读都一样的字符串,例如“racecar”。我们将使用双端队列的特性来高效地检查一个给定的字符串是否是回文。

示例代码

import java.util.ArrayDeque;
import java.util.Deque;public class PalindromeChecker {public static boolean isPalindrome(String str) {Deque<Character> deque = new ArrayDeque<>();// 将字符串中的字符添加到双端队列中for (char c : str.toLowerCase().toCharArray()) {if (Character.isLetter(c)) {deque.addLast(c);}}char first, last;while (deque.size() > 1) {first = deque.removeFirst();last = deque.removeLast();if (first != last) {return false;}}return true;}public static void main(String[] args) {String testString = "A man a plan a canal Panama";if (isPalindrome(testString)) {System.out.println(testString + " is a palindrome.");} else {System.out.println(testString + " is not a palindrome.");}}
}

代码解释

在这段代码中,我们定义了一个名为PalindromeChecker的类,其中包含一个静态方法isPalindrome,该方法接受一个字符串参数并返回一个布尔值,指示该字符串是否为回文。

  1. 初始化双端队列:我们使用ArrayDeque作为双端队列的实现,并将其实例化。
  2. 添加字符:遍历输入字符串的每个字符,只将字母字符转换为小写并添加到队列的尾部。
  3. 比较字符:从双端队列的头部和尾部同时移除字符,并比较它们是否相同。如果任何时候两个字符不匹配,那么字符串就不是回文,方法立即返回false
  4. 结束条件:如果队列中只剩下一个字符或没有字符,则说明字符串是回文,方法返回true

运行结果

当你运行main方法时,它会检查字符串“A man a plan a canal Panama”是否为回文。由于忽略空格和大小写,这个字符串实际上是一个回文,因此控制台将输出:“A man a plan a canal Panama is a palindrome.”

这个例子展示了如何利用双端队列的特性来简化和优化一些算法,如回文检测,这在实际编程中是非常有用的技巧。

接下来,我们将使用双端队列(Deque)来解决一个有趣的问题:浏览器的历史记录管理。当我们浏览网页时,通常会使用浏览器的前进和后退按钮来在历史记录之间导航。双端队列非常适合模拟这一行为,因为它允许我们在队列的两端高效地添加和移除元素。

示例代码

import java.util.ArrayDeque;
import java.util.Deque;public class BrowserHistory {private Deque<String> history;private Deque<String> forwardHistory;public BrowserHistory() {history = new ArrayDeque<>();forwardHistory = new ArrayDeque<>();}// 访问新的网址public void visit(String url) {history.addLast(url);forwardHistory.clear(); // 清空前进历史}// 返回上一个页面public String back() {if (history.size() > 1) {String currentUrl = history.removeLast();forwardHistory.addFirst(currentUrl);return history.getLast();} else {return "No more pages to go back.";}}// 前往下一个页面public String forward() {if (!forwardHistory.isEmpty()) {String nextUrl = forwardHistory.removeFirst();history.addLast(nextUrl);return nextUrl;} else {return "No more pages to go forward.";}}public static void main(String[] args) {BrowserHistory browser = new BrowserHistory();// 访问一些网址browser.visit("google.com");browser.visit("youtube.com");browser.visit("facebook.com");// 后退到上一个页面System.out.println("Back: " + browser.back());// 再次后退System.out.println("Back again: " + browser.back());// 前进到下一个页面System.out.println("Forward: " + browser.forward());}
}

表格说明

浏览器历史记录操作记录
操作描述当前页面历史记录(从左至右为最新至最旧)前进历史(从左至右为最近至最远)
初始化创建一个新的浏览器历史管理器N/A[][]
访问(visit)访问“google.com”google.com[“google.com”][]
访问(visit)访问“youtube.com”youtube.com[“google.com”, “youtube.com”][]
访问(visit)访问“facebook.com”facebook.com[“google.com”, “youtube.com”, “facebook.com”][]
后退(back)后退到上一个页面youtube.com[“google.com”, “youtube.com”][“facebook.com”]
后退(back)再次后退google.com[“google.com”][“youtube.com”, “facebook.com”]
前进(forward)前进到下一个页面youtube.com[“google.com”, “youtube.com”][“facebook.com”]

通过这个案例和表格,我们可以看到双端队列如何有效地模拟浏览器的历史记录管理。每当访问一个新的网址时,它会被添加到历史记录的尾部,并清空前进历史。后退操作会从历史记录的尾部移除当前页面并将其添加到前进历史的头部,而前进操作则相反。这种方法保证了高效且直观的网页导航体验。

相关文章:

数据结构第08小节:双端队列

双端队列&#xff08;deque&#xff0c;double-ended queue&#xff09;是一种具有队列和栈特性的数据结构&#xff0c;允许在其两端进行插入和删除操作。在Java中&#xff0c;java.util.Deque接口就是双端队列的实现&#xff0c;而ArrayDeque和LinkedList是其中的具体实现类。…...

Python骨架肌体运动学数学模型

&#x1f3af;要点 &#x1f3af;运动学矢量计算 | &#x1f3af;跳远的运动学计算 | &#x1f3af;关节肢体运动最小加加速度模型 | &#x1f3af;膝关节和踝关节角度二维运动学计算 | &#x1f3af;上下肢体关节连接运动链数学模型 | &#x1f3af;刚体连接点速度加速度计算…...

二叉树的序列化和反序列化(Java)

概述 关于面试中常见的其他二叉树算法题&#xff0c;参考面试算法之二叉树(Java)。二叉树的定义&#xff08;注意到有使用lombok提供的两个注解&#xff09;&#xff1a; lombok.Data lombok.AllArgsConstructor private static class TreeNode {private TreeNode left;priva…...

Java中的泛型类

Java中的泛类 Java 的泛型&#xff08;Generics&#xff09;是一种语言特性&#xff0c;允许你定义类、接口和方法时使用类型参数。这使得代码更具可读性和安全性&#xff0c;因为编译器能够在编译时检查类型&#xff0c;而不是在运行时。 泛型类 定义泛型类时&#xff0c;可…...

57、Flink 的项目配置概述

1&#xff09;概览 1.开始 要开始使用 Flink 应用程序&#xff0c;请使用以下命令、脚本和模板来创建 Flink 项目。 可以使用如下的 Maven 命令或快速启动脚本&#xff0c;基于原型创建一个项目。 a&#xff09;Maven 命令 mvn archetype:generate \-Darch…...

零基础自学爬虫技术该从哪里入手?

零基础学习Python并不一定是困难的&#xff0c;这主要取决于个人的学习方法、投入的时间以及学习目标的设定。Python是一门相对容易入门的编程语言&#xff0c;它有着简洁的语法、丰富的库和广泛的应用领域&#xff08;如数据分析、Web开发、人工智能等&#xff09;&#xff0c…...

Vue.js 基础入门指南

前言 在前端开发的广阔领域中&#xff0c;Vue.js 无疑是一颗璀璨的明星&#xff0c;以其渐进式框架的特性吸引了无数开发者的目光。Vue.js 旨在通过简洁的 API 实现响应式的数据绑定和组合的视图组件&#xff0c;使得构建用户界面变得既快速又简单。本文将带你走进 Vue.js 的世…...

山泰科技集团陈玉东:争当数字化时代的知识产权卫士

随着互联网和数字技术的飞速普及&#xff0c;大版权时代已经悄然到来。在这个新时代&#xff0c;信息的传播速度、广度和深度均达到了前所未有的高度&#xff0c;极大地拓展了人们的精神世界和知识视野。然而&#xff0c;这一科技发展的浪潮也为版权保护带来了前所未有的挑战。…...

WBCE CMS v1.5.2 远程命令执行漏洞(CVE-2022-25099)

前言 CVE-2022-25099 是一个影响 WBCE CMS v1.5.2 的严重安全漏洞&#xff0c;具体存在于 /languages/index.php 组件中。该漏洞允许攻击者通过上传精心构造的 PHP 文件在受影响的系统上执行任意代码。 技术细节 受影响组件&#xff1a;/languages/index.php受影响版本&…...

鸿蒙语言基础类库:【@ohos.url (URL字符串解析)】

URL字符串解析 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入…...

【AutoencoderKL】基于stable-diffusion-v1.4的vae对图像重构

模型地址&#xff1a;https://huggingface.co/CompVis/stable-diffusion-v1-4/tree/main/vae 主要参考:Using-Stable-Diffusion-VAE-to-encode-satellite-images sd1.4 vae 下载到本地 from diffusers import AutoencoderKL from PIL import Image import torch import to…...

《警世贤文》摘抄:守法篇、惜时篇、修性篇、修身篇、待人篇、防人篇(建议多读书、多看报、少吃零食多睡觉)

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140243440 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

vue2+element-ui新增编辑表格+删除行

实现效果&#xff1a; 代码实现 &#xff1a; <el-table :data"dataForm.updateData"border:header-cell-style"{text-align:center}":cell-style"{text-align:center}"><el-table-column label"选项字段"align"center&…...

Day05-组织架构-角色管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.组织架构-编辑部门-弹出层获取数据2.组织架构-编辑部门-编辑表单校验3.组织架构-编辑部门-确认取消4.组织架构-删除部门5.角色管理-搭建页面结构6.角色管理-获取数…...

【LLM】二、python调用本地的ollama部署的大模型

系列文章目录 往期文章&#xff1a; 【LLM】一、利用ollama本地部署大模型 目录 文章目录 前言 一、ollama库调用 二、langchain调用 三、requests调用 四、相关参数说明&#xff1a; 总结 前言 本地部署了大模型&#xff0c;下一步任务便是如何调用的问题&#xff0c…...

20240708 每日AI必读资讯

&#x1f916;破解ChatGPT惊人耗电&#xff01;DeepMind新算法训练提效13倍&#xff0c;能耗暴降10倍 - 谷歌DeepMind研究团队提出了一种加快AI训练的新方法——多模态对比学习与联合示例选择&#xff08;JEST&#xff09;&#xff0c;大大减少了所需的计算资源和时间。 - JE…...

为什么KV Cache只需缓存K矩阵和V矩阵,无需缓存Q矩阵?

大家都知道大模型是通过语言序列预测下一个词的概率。假定{ x 1 x_1 x1​&#xff0c; x 2 x_2 x2​&#xff0c; x 3 x_3 x3​&#xff0c;…&#xff0c; x n − 1 x_{n-1} xn−1​}为已知序列&#xff0c;其中 x 1 x_1 x1​&#xff0c; x 2 x_2 x2​&#xff0c; x 3 x_3 x…...

VS code修改底部的行号的状态栏颜色

VSCode截图 相信很多小伙伴被底部的蓝色状态栏困扰很久了 处理的方式有两种&#xff1a; 1、隐藏状态栏 2、修改其背景颜色 第一种方法大伙都会&#xff0c;今天就使用第二种方法。 1、点击齿轮进入setting 2、我现在用的新版本&#xff0c;设置不是以前那种json格式展示&…...

【鸿蒙学习笔记】MVVM模式

官方文档&#xff1a;MVVM模式 [Q&A] 什么是MVVM ArkUI采取MVVM Model View ViewModel模式。 Model层&#xff1a;存储数据和相关逻辑的模型。View层&#xff1a;在ArkUI中通常是Component装饰组件渲染的UI。ViewModel层&#xff1a;在ArkUI中&#xff0c;ViewModel是…...

端、边、云三级算力网络

目录 端、边、云三级算力网络 NPU Arm架构 OpenStack kubernetes k3s轻量级Kubernetes kubernetes和docker区别 DCI(Data Center Interconnect) SD/WAN TF 端、边、云三级算力网络 算力网络从传统云网融合的角度出发,结合 边缘计算、网络云化以及智能控制的优势,通…...

【仅限JDK 25 Early Access用户】:隐藏API `LinkerOptions` 强制启用向量化调用的2行代码,实测吞吐提升2.8倍

第一章&#xff1a;Java 25 外部函数接口优化案例Java 25 正式将外部函数与内存 API&#xff08;Foreign Function & Memory API&#xff09;从预览特性转为正式特性&#xff0c;显著提升了 JVM 与本地代码交互的安全性、性能与开发体验。相比早期 JNI 方案&#xff0c;FFM…...

从BUUCTF的Hack World靶场,聊聊那些年我们踩过的SQL注入“异或”盲注坑

从BUUCTF的Hack World靶场&#xff0c;聊聊那些年我们踩过的SQL注入"异或"盲注坑 在CTF竞赛的Web安全赛道上&#xff0c;SQL注入始终是经久不衰的考点。当新手们刚掌握联合查询和报错注入时&#xff0c;往往会在一道名为Hack World的题目前栽跟头——这道来自CISCN2…...

MiniCPM-o-4.5-nvidia-FlagOS部署运维:使用Docker Compose管理多服务依赖

MiniCPM-o-4.5-nvidia-FlagOS部署运维&#xff1a;使用Docker Compose管理多服务依赖 你是不是也遇到过这种情况&#xff1f;想部署一个AI模型&#xff0c;发现它依赖一堆东西&#xff1a;模型服务本身、数据库、缓存、可能还有别的辅助工具。一个个手动去装、去配置、去启动&…...

从安防摄像头到直播:手把手教你用ZLMediaKit搭建GB28181视频监控平台

从安防摄像头到直播&#xff1a;手把手教你用ZLMediaKit搭建GB28181视频监控平台 在智能安防和物联网快速发展的今天&#xff0c;视频监控系统的网络化和智能化已成为行业标配。GB28181作为国内视频监控领域的国家标准协议&#xff0c;实现了不同厂商设备间的互联互通。而ZLMed…...

Godep历史意义揭秘:Go依赖管理工具的开创者如何改变开发方式

Godep历史意义揭秘&#xff1a;Go依赖管理工具的开创者如何改变开发方式 【免费下载链接】godep dependency tool for go 项目地址: https://gitcode.com/gh_mirrors/go/godep Godep作为Go语言依赖管理工具的开创者&#xff0c;在Go生态系统的演进历程中扮演了至关重要的…...

如何用XHS-Downloader解决内容采集难题?3大维度提升效率90%

如何用XHS-Downloader解决内容采集难题&#xff1f;3大维度提升效率90% 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作品、用户链接…...

效率倍增:基于快马平台集成最新openclaw构建自动化采集工具

最近在做一个数据采集项目时&#xff0c;发现手动写爬虫实在太费时间了。每次都要重复处理请求头、代理设置、数据清洗这些基础工作&#xff0c;效率特别低。后来发现了openclaw这个工具包的新版本&#xff0c;正好结合InsCode(快马)平台快速搭建了一个自动化采集工具&#xff…...

数据中台是什么?怎么搭建数据中台?

去年&#xff0c;一家零售企业的CEO找到我&#xff0c;说了一句让我印象很深的话&#xff1a; "我们公司有数据&#xff0c;但没有数据能力。"很多企业建数据中台&#xff0c;是为了管好数据。 但这个出发点&#xff0c;从一开始就错了。 数据中台的核心不是管理&…...

抖音批量下载终极指南:3分钟掌握高效无水印下载技巧

抖音批量下载终极指南&#xff1a;3分钟掌握高效无水印下载技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...

teler IDS v3前瞻:eBPF技术与teler-waf集成带来的革命性变革

teler IDS v3前瞻&#xff1a;eBPF技术与teler-waf集成带来的革命性变革 【免费下载链接】teler Real-time HTTP Intrusion Detection 项目地址: https://gitcode.com/gh_mirrors/te/teler teler IDS作为一款实时HTTP入侵检测系统&#xff0c;在网络安全领域已经建立了坚…...