Java学数据结构(1)——抽象数据类型ADT 表List、栈Stack和队列Qeue

目录

  • 引出
  • 抽象数据类型(abstract data type,ADT)
  • 表List
    • ArrayList,Vector, LinkedList
    • ArrayList手动实现与分析
    • Vector的分析(线程安全)
    • LinkedList 的手动实现与分析
  • 栈stack—后进先出
    • java中stack源码分析
    • 栈的应用:检查程序括号是否闭合
    • 栈的应用:后缀表达式
  • 队列queue—先进先出
    • Java中的queue
    • 队列的应用
    • RabbitMq队列
  • 总结

引出


1.抽象数据类型Abstract data type的概念;
2.表list,java中的ArrayList和linkedlist以及vector的分析;
3.栈stack的分析以及应用;
4.队列queue的理解,以及rabbitmq的应用;

抽象数据类型(abstract data type,ADT)

在这里插入图片描述

抽象数据类型(abstract data type,ADT)是带有一组操作的一些对象的集合。抽象数据类型是数学的抽象;在ADT的定义中没有地方提到关于这组操作是如何实现的任何解释。

诸如表、集合、图以及与它们各自的操作一起形成的这些对象都可以被看做是抽象数据类型,这就像整数、实数、布尔数都是数据类型一样。整数、实数和布尔数各自都有与之相关的操作,而抽象数据类型也是如此。

对于集合ADT,可以有像添加(add)、删除(remove)以及包含(contain)这样一些操作。当然,也可以只要两种操作并(union)和查找(ind),这两种操作又在这个集合上定义了一种不同的ADT。

在这里插入图片描述

表List

ArrayList,Vector, LinkedList

  1. ArrayList:

    • 底层数据结构是数组,使用动态数组实现。
    • 查询元素的性能较好,时间复杂度为O(1)。
    • 插入和删除元素的性能较差,需要移动其他元素,时间复杂度为O(n)。
    • 不是线程安全的,适用于单线程环境。
    • 可以通过指定初始容量来提高性能。
  2. Vector:

    • 底层数据结构也是数组,与ArrayList类似,但是Vector是线程安全的。
    • 查询、插入和删除元素的性能与ArrayList相似。
    • 由于线程安全的特性,Vector的性能通常比ArrayList略差。
    • 可以通过指定初始容量和增长因子来提高性能。
  3. LinkedList:

    • 底层数据结构是双向链表。
    • 查询元素的性能较差,需要遍历链表,时间复杂度为O(n)。
    • 插入和删除元素的性能较好,只需要修改相邻节点的指针,时间复杂度为O(1)。
    • 不是线程安全的,适用于单线程环境。
    • 适用于频繁插入和删除元素的场景。

综上所述,如果需要频繁进行查询操作,可以选择ArrayList或Vector;如果需要频繁进行插入和删除操作,可以选择LinkedList。如果需要线程安全,可以选择Vector。另外,ArrayList是最常用的一种集合类,因为它在大多数场景下具有较好的性能和灵活性。

ArrayList手动实现与分析

Java进阶(3)——手动实现ArrayList & 源码的初步理解分析 & 数组插入数据和删除数据的问题

在这里插入图片描述

Vector的分析(线程安全)

在这里插入图片描述

synchronize锁:线程安全

在这里插入图片描述

LinkedList 的手动实现与分析

Java进阶(7)——手动实现LinkedList & 内部node类的实现 & 增删改查的实现 & toString方法 & 源码的初步理解

在这里插入图片描述

栈stack—后进先出

在这里插入图片描述

栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫作栈的顶(top)。栈有时又叫作LIFO(后进先出)表。

对栈的基本操作有push(进栈)和pop(出栈),前者相当于插人,后者则是删除最后插入的元素。最后插入的元素可以通过使用top例程在执行pop之前进行考查。对空栈进行的pop或top一般被认为是栈ADT中的一个错误。另一方面,当运行push时空间用尽是一个实现限制,但不是ADT错误。

在这里插入图片描述

java中stack源码分析

在这里插入图片描述

peek方法和pop方法

  • peek()方法用于查看栈顶元素,但不会将其从栈中移除。它返回栈顶元素的值,并不改变栈的状态。如果栈为空,则会抛出EmptyStackException异常。
  • pop()方法用于移除并返回栈顶元素。它将栈顶元素从栈中弹出,并返回其值。如果栈为空,则会抛出EmptyStackException异常。

这两个方法在栈的操作中非常常用。通过peek()方法,我们可以查看栈顶元素的值,而不改变栈的状态。通过pop()方法,我们可以移除并获取栈顶元素的值,同时改变栈的状态。

在这里插入图片描述

栈的应用:检查程序括号是否闭合

在这种情况下,一个有用的工具就是检验是否每件事情都能成对的程序。于是,每一个右花括号、右方括号及右圆括号必然对应其相应的左括号。序列 [ ( ) ] 是合法的,但 [ ( ] ) 是错误

这个简单的算法用到一个栈,叙述如下:

做一个空栈。读入字符直到文件结尾。如果字符是一个开放符号,则将其推入栈中。如果字符是一个封闭符号,则当栈空时报错。否则,将栈元素弹出。如果弹出的符号不是对应的开放符号,则报错。在文件结尾,如果栈非空则报错。

import java.util.Stack;public class ParenthesesChecker {public static boolean checkParentheses(String code) {Stack<Character> stack = new Stack<>();for (int i = 0; i < code.length(); i++) {char c = code.charAt(i);if (c == '(' || c == '[' || c == '{') {stack.push(c);} else if (c == ')' || c == ']' || c == '}') {if (stack.isEmpty()) {return false;}char top = stack.pop();if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {return false;}}}return stack.isEmpty();}public static void main(String[] args) {String code1 = "((a + b) * (c - d))";String code2 = "((a + b) * (c - d)";String code3 = "((a + b) * (c - d))}";String code4 = "((a + b) * (c - d))]";String code5 = "((a + b) * (c - d))}";System.out.println("Code 1 is valid: " + checkParentheses(code1));System.out.println("Code 2 is valid: " + checkParentheses(code2));System.out.println("Code 3 is valid: " + checkParentheses(code3));System.out.println("Code 4 is valid: " + checkParentheses(code4));System.out.println("Code 5 is valid: " + checkParentheses(code5));}
}

栈的应用:后缀表达式

后缀表达式(也称为逆波兰表达式)是一种不使用括号来表示运算符优先级的数学表达式表示方法。在后缀表达式中,运算符位于操作数之后。

例如,将中缀表达式"3 + 4 * 2 - 5"转换为后缀表达式,得到"3 4 2 * + 5 -"。

后缀表达式的计算可以通过使用栈来实现。遍历后缀表达式,当遇到操作数时,将其入栈;当遇到运算符时,从栈中弹出两个操作数进行运算,并将结果入栈。最后,栈中剩下的元素即为计算结果。

在这里插入图片描述

在这里插入图片描述

队列queue—先进先出

像栈一样,队列(queue)也是表。然而,使用队列时插入在一端进行而删除则在另一端进行。Queue(队列)是一种常用的数据结构,用于存储和操作元素。它遵循先进先出(FIFO)的原则,即最先进入队列的元素最先被取出。

在这里插入图片描述

队列的基本操作是enqueue(入队),它是在表的末端(叫作队尾(rear))插入一个元素,和dequeue(出队),它是删除(并返回)在表的开头(叫作队头(front))的元素。

Java中的queue

Java提供了多种实现Queue接口的类,常用的有以下几种:

  1. LinkedList:LinkedList类实现了Queue接口,可以用作队列的实现。它既可以作为队列使用,也可以作为双端队列使用。
  2. ArrayDeque:ArrayDeque类也实现了Queue接口,它是一个基于数组的双端队列。它可以在队列的两端进行插入和删除操作,因此可以作为队列或栈使用。
  3. PriorityQueue:PriorityQueue类实现了Queue接口,它是一个优先级队列。元素按照优先级进行排序,每次取出的元素都是优先级最高的。

这些类都实现了Queue接口,因此具有类似的方法,如offer()用于添加元素到队列尾部,poll()用于取出队列头部的元素并删除它,peek()用于查看队列头部的元素但不删除它,isEmpty()用于判断队列是否为空,size()用于获取队列的大小等。

import java.util.LinkedList;
import java.util.Queue;public class QueueExample {public static void main(String[] args) {Queue<String> queue = new LinkedList<>();// 添加元素到队列尾部queue.offer("A");queue.offer("B");queue.offer("C");// 取出队列头部的元素并删除它String first = queue.poll();System.out.println("取出的元素:" + first);// 查看队列头部的元素但不删除它String peek = queue.peek();System.out.println("队列头部的元素:" + peek);// 判断队列是否为空boolean isEmpty = queue.isEmpty();System.out.println("队列是否为空:" + isEmpty);// 获取队列的大小int size = queue.size();System.out.println("队列的大小:" + size);}
}

队列的应用

当作业送交给一台行式打印机的时候,它们就以到达的顺序被排列起来。因此,被送往行式打印机的作业基本上被放到一个队列中。

事实上每一个实际生活中的排队都(应该)是一个队列。例如,在一些售票口排列的队伍都是队列,因为服务的顺序是先到先买票。

另一个例子是关于计算机网络的。有多种PC机的网络设置,其中磁盘是放在一台叫作文件服务器(file server)的机器上的。使用其他计算机的用户是按照先到先使用的原则访问文件的,因此其数据结构是一个队列。

进一步的例子如下:

  • 当所有的接线员忙不开的时候,对大公司的呼叫一般都被放到一个队列中。
  • 在大型的大学里,如果所有的终端都被占用,由于资源有限,学生们必须在一个等待表上签字登记。在终端上停留时间最长的学生将首先被强制离开,而等待时间最长的学生则将是下一个被允许使用终端的用户。

RabbitMq队列

RabbitMQ基础(1)——生产者消费者模型 & RabbitMQ简介 & Docker版本的安装配置 & RabbitMQ的helloworld + 分模块构建 & 解决大量注册案例

https://www.rabbitmq.com/

在这里插入图片描述

RabbitMQ基础(2)——发布订阅/fanout模式 & topic模式 & rabbitmq回调确认 & 延迟队列(死信)设计

在这里插入图片描述


总结

1.抽象数据类型Abstract data type的概念;
2.表list,java中的ArrayList和linkedlist以及vector的分析;
3.栈stack的分析以及应用;
4.队列queue的理解,以及rabbitmq的应用;

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

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

相关文章

使用 Feature Flags 与可观测工具实现数据库灰度迁移

场景描述 很多企业会遇到数据库升级、或数据库迁移的情况&#xff0c;尤其是在自建数据库服务向云数据库服务、自建机房向云机房、旧数据库向新数据库迁移等场景。 然而&#xff0c;我们需要在整个移植过程中保证其稳定性、避免数据遗失、服务宕机等情况&#xff0c;最常见的移…

数据结构 | 堆

本文简要总结堆的概念。 更新&#xff1a;2023 / 8 / 20 数据结构 | 堆 堆概念方法插入步骤 删除步骤 示例大根堆堆插入删除堆排序 代码实现Python大根堆1.2. heapq 小根堆1.2. heapq 参考链接 堆 概念 如果谈到堆排序&#xff0c;那么必然要说说什么是 大根堆 max heap 和 …

百度23Q2财报最新发布:营收利润加速增长,AI+生态战略渐显规模

百度集团-SW(9888.HK)Q2财报已于2023/08/22(美东)盘前发布&#xff0c;二季度百度集团整体收入实现341亿元&#xff0c;同比增长15%;归属百度的净利润(non-GAAP)达到80亿元&#xff0c;同比增长44%。营收和利润双双实现大幅增长&#xff0c;超市场预期。其中&#xff0c;百度核…

基于乌燕鸥算法优化的BP神经网络(预测应用) - 附代码

基于乌燕鸥算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于乌燕鸥算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.乌燕鸥优化BP神经网络2.1 BP神经网络参数设置2.2 乌燕鸥算法应用 4.测试结果&#xff1a;5.Matlab代…

课程项目设计--项目建立--宿舍管理系统--springboot后端

前要 项目设计–宿舍管理系统 文章目录 项目建立导入依赖配置文件配置目录结构config配置mybatis-plusswagger 生成实体、mapper和servicebaseEntity统一响应实例响应码接口响应码接口实现统一响应result统一分页响应 项目建立 太长了&#xff0c;修改一下 导入依赖 暂时先加…

深入浅出理解相机标定原理

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 微信公众号&#xff1a;计算机视觉life 专栏&#xff1a;#相机标定 Camera Calibration 张正友标定法-完整学习笔记-从原理到实战 二、相机标定相…

文件内容搜索工具 - Python实现

在本篇文章中&#xff0c;我们将介绍如何使用 wxPython 库创建一个简单的文件搜索工具。这个工具允许用户选择一个文件夹&#xff0c;并在该文件夹中的所有 .py 文件中查找指定的文字&#xff0c;并显示匹配的位置。 C:\pythoncode\blog\searchwordinpyfile.py 代码实现 我们首…

Android 场景Scene的使用

Scene 翻译过来是场景&#xff0c;开发者提供起始布局和结束布局&#xff0c;就可以实现布局之间的过渡动画。 具体可参考 使用过渡为布局变化添加动画效果 大白话&#xff0c;在 Activity 的各个页面之间切换&#xff0c;会带有过渡动画。 打个比方&#xff0c;使用起来类似…

点亮社交新篇章:探索 WeTalk 新增的头像与群聊功能

目录 引言&#xff1a; 引入头像功能&#xff1a; 头像功能的优势&#xff1a; 引入群聊功能&#xff1a; 群聊功能的优势&#xff1a; 引入头像功能&#xff1a; 查看头像&#xff1a; ​编辑 上传头像&#xff1a; 引入群聊功能&#xff1a; 创建群聊&#xff1a…

八月更新 | CI 构建计划触发机制升级、制品扫描 SBOM 分析功能上线!

点击链接了解详情 这个八月&#xff0c;腾讯云 CODING DevOps 对持续集成、制品管理、项目协同、平台权限等多个产品模块进行了升级改进&#xff0c;为用户提供更灵活便捷的使用体验。以下是 CODING 新功能速递&#xff0c;快来看看是否有您期待已久的功能特性&#xff1a; 01…

RabbitMq-3入门案例

rabbitmq入门 1.生产者&#xff08;服务提供方&#xff09; //依赖<dependencies> <!-- rabbitmq客户端依赖--><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0<…

什么是链表,前端如何理解链表

一、什么是链表 多个元素存储的列表链表中的元素在内存中不是顺序存储的&#xff0c;而是通过“next”指针联系在一起的。 JS中的原型链 原理就是 链表结构 链表结构 {key: "A",next: {key: "B",next: {key: "C",next: null}} } //原型链 //对…

数电票红利悄然而至 百望云数据驱引“供应链协同”新纪元

2023年&#xff0c;全面数字化的电子发票政策正如飞驰的列车在各地试点推广中加速前行&#xff0c;“以数治税”的全新时代即将来临&#xff0c;基于数电票赋能的企业数字化红利正在悄然释放。借着政策快速落地的东风&#xff0c;财税数字化也进入到全面建设的新周期&#xff0…

微服务流程引擎:简单又灵活,实现流程全生命周期管理!

伴随着日益激烈的市场竞争&#xff0c;传统的办公操作已经无法满足发展需要了。如果采用微服务流程引擎加油助力&#xff0c;就可以帮助企业更好地管理数据资源&#xff0c;高效做好各种表单制作&#xff0c;实现高效率办公。流辰信息以市场为导向&#xff0c;用心钻研低代码技…

C++设计模式(工厂方法模式)

文章目录 前言一、工厂方法模式介绍二、工厂方法模式和简单工厂模式对比三、工厂方法模式适用场景四、工厂方法模式示例代码总结 前言 本篇文章来带大家学习C中的工厂方法模式。 一、工厂方法模式介绍 工厂方法模式是一种创建型设计模式&#xff0c;用于通过工厂方法创建对象…

C++ string 类

文章目录 引用头文件初始化赋值1. 空串2. 拷贝复制3. 直接初始化赋值4. 单个字符初始化 遍历 string 类1. 下标索引遍历2. 迭代器遍历3. 使用 range for 循环遍历字符串&#xff08;需要 C11 或更新的版本&#xff09; string 常用方法判断字符串是否为空串获取字符串中字符个数…

数据中台容易失败的20多种原因全部在这里了

数据中台失败的原因总结 在当今数字化转型的浪潮中&#xff0c;数据中台作为关键的战略举措被越来越多的企业所关注和实施。然而&#xff0c;数据中台项目的实施过程中并不乏失败案例&#xff0c;这引业界对于数据中台失败原因的深入思考和分析。通过一些公开的信息和数据&…

如何使用海艺人工智能生成创意汉字

1、用某种字体生成文字。 jf storehttps://store.justfont.com/fonts 2、打开seaart。ai网站。https://www.seaart.ai/home 3、效果如下。 4、右键保存图片。

【算法日志】动态规划刷题:路径数问题(day34)

代码随想录刷题60Day 目录 前言 不同路径 不同路径(2) 前言 今天的动态规划题与昨天的题很类似&#xff0c;只不过今天的题是在二维上讨论&#xff0c;难度上略有提升。 不同路径 int uniquePaths(int m, int n) {vector<int> dp(n 1, 1);for (int i 1; i < m; …

C语言:选择+编程(每日一练Day7)

目录 选择题&#xff1a; 题一&#xff1a; 题二&#xff1a; 题三&#xff1a; 题四&#xff1a; 题五&#xff1a; 编程题&#xff1a; 题一&#xff1a;图片整理 思路一&#xff1a; 思路二&#xff1a; 题二&#xff1a;寻找数组的中心下标 思路一&#xff1…