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的应用;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创邻科技张晨:图数据库,激活数据要素的新基建

“数据经济时代&#xff0c;数据要素产业链的各细分领域均蕴含机遇&#xff0c;图技术作为网络协同和数据智能的底层发动机&#xff0c;将深度掘金数字中国价值潜能”。 8月22日&#xff0c;在2023中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会的信息技术…

Day48|leetcode 198.打家劫舍、213.打家劫舍II、打家劫舍|||

leetcode 198.打家劫舍 题目链接&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 视频链接&#xff1a;动态规划&#xff0c;偷不偷这个房间呢&#xff1f;| LeetCode&#xff1a;198.打家劫舍_哔哩哔哩_bilibili 题目概述 你是一个专业的小偷&#xff0c;…

【Android】TextView适配文本大小并保证中英文内容均在指定的UI 组件内部

问题 现在有一个需求&#xff0c;在中文环境下textView没有超过底层的组件限制&#xff0c;但是一切换到英文环境就超出了&#xff0c;这个如何解决呢&#xff1f;有啥例子吗&#xff1f; 就像这样子的。 解决 全部代码如下&#xff1a; <?xml version"1.0"…

汽车电子笔记之:AUTOSAR方法论及基础概念

目录 1、AUTOSAR方法论 2、AUTOSAR的BSW 2.1、MCAL 2.2、ECU抽象层 2.3、服务层 2.4、复杂驱动 3、AUTOSAR的RTE 4、AUTOSAR的应用层 4.1、SWC 4.2、AUTOSAR的通信 4.3、AUTOSAR软件接口 1、AUTOSAR方法论 AUTOSAR为汽车电子软件系统开发过程定义了一套通用的技术方法…

腾讯云coding平台平台inda目录遍历漏洞复现

前言 其实就是一个python的库可以遍历到&#xff0c;并不能遍历到别的路径下&#xff0c;后续可利用性不大&#xff0c;并且目前这个平台私有部署量不多&#xff0c;大多都是用腾讯云在线部署的。 CODING DevOps 是面向软件研发团队的一站式研发协作管理平台&#xff0c;提供…

基于Ubuntu坏境下的Suricata坏境搭建

目录 Suricata环境安装 第一步、在 Ubuntu 端点安装 Suricata 1、加入Suricata源 2、更新安装包 3、下载SuricataSuricata 第二步、下载并提取新兴威胁 Suricata 规则集 1、在tmp文件夹下载 Suricata 规则集 如果发现未安装curl&#xff0c;使用apt安装即可&#xff1a;…

QT 消息对话框按钮显示

前言 搞QT嘛&#xff0c;大多数都是军工。都要国产化&#xff0c;而且消息对话框的按钮的英文也不是很得劲&#xff0c;所以需要汉化。使用静态函数的按钮就是显示英文&#xff0c;汉化的代码如下。 void Widget::on_pushButton_clicked() {QMessageBox box(QMessageBox::Inf…

MySQL 条件查询 Emoji 表情符号却返回多条数据【包含其它表情符号】的问题解决 - COLLATION 字符序的选择

1、问题出现 在APP客户端输入搜索文章的关键字时&#xff0c;不小心输入来了一个 emoji 表情符号&#xff0c;提示出错了&#xff0c;在后台查询错误日志信息&#xff0c;提示查询出现了2条相同的记录&#xff1a; Caused by: org.hibernate.NonUniqueResultException: query …

LNMT与动静分离

目录 一、LNMT 一、部署tomcat 二、部署nginx 三、部署mariadb 四、配置nginx 二、操作流程及步骤 一、在第一台机器上进入 vim /etc/nginx/nginx.conf 更改配置文件 二、并查看端口是否成功启动 三、验证 四、再次来到网页验证 五、动静分离&#xff08;修改配置…

HTTP 框架修炼之道 | 青训营

Powered by:NEFU AB-IN 文章目录 HTTP 框架修炼之道 | 青训营 走进 HTTP 协议HTTP 框架的设计与实现应用层中间件层路由设计协议层 传输层&#xff08;网络层&#xff09;1. BIO&#xff08;Blocking I/O&#xff09;:2. NIO&#xff08;Non-blocking I/O&#xff09;:区别&…

设计模式入门笔记

1 设计模式简介 在IT这个行业&#xff0c;技术日新月异&#xff0c;可能你今年刚弄懂一个编程框架&#xff0c;明年它就不流行了。 然而即使在易变的IT世界也有很多几乎不变的知识&#xff0c;他们晦涩而重要&#xff0c;默默的将程序员划分为卓越与平庸两类。比如说&#xff…

【C++】开源:Box2D动力学库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Box2D动力学库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c…

MATLAB软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 MATLAB是Matrix Laboratory的缩写&#xff0c;是一款由美国MathWorks公司开发的商业数学软件。它主要用于进行数值计算、数据分析、可视化、算法开发、模拟仿真等多个领域。MATLAB具有高度的灵活性和开放性&#xff0c;可以为用…

SpringBoot异步方法支持注解@Async应用

SpringBoot异步方法支持注解Async应用 1.为什么需要异步方法&#xff1f; 合理使用异步方法可以有效的提高执行效率 同步执行(同在一个线程中): 异步执行(开启额外线程来执行): 2.SpringBoot中的异步方法支持 在SpringBoot中并不需要我们自己去创建维护线程或者线程池来异…

C#搭建WebSocket服务实现通讯

在学习使用websocket之前我们先了解一下websocket&#xff1a; WebSocket是一种在单个TCP连接上进行全双工通信的通信协议。与HTTP协议不同&#xff0c;它允许服务器主动向客户端发送数据&#xff0c;而不需要客户端明确地请求。这使得WebSocket非常适合需要实时或持续通信的应…

AliOS-Things引入

目录 一、简介 1.1 硬件抽象层 1.2 AliOS-Things内核 rhino ​编辑 1.3 AliOS-Things组件 二、如何进行AliOS-Things开发 三、安装环境 安装python pip git 修改pip镜像源 安装aos-cube 一、简介 AliOS-Things是阿里巴巴公司推出的致力于搭建云端一体化LoT软件。AliOS-…

vue数字输入框

目录 1.emitter.JS function broadcast (componentName, eventName, params) {this.$children.forEach(child => {var name = child.$options.componentNameif (name === componentName) {child.$emit.apply(child, [eventName].concat(params))} else {broadcast.apply(c…

CEdit 选中文字实时更新到另一个控件中

有时候&#xff0c;我们会遇到需求&#xff0c;软件中需要让选中一个CEdit控件中的文字实时更新到另一个控件中&#xff0c;实现效果如下所示&#xff1a; 代码如下&#xff1a; BOOL CEditDemoDlg::PreTranslateMessage(MSG* pMsg) { CEdit* pOldEdit (CEdit*)GetDlgIte…

无锁并发:探秘CAS机制的魔力

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 无锁并发&#xff1a;探秘CAS机制的魔力 ⏱️ 创作时间&#xff1a; 2…

线程池等待对象回调函数执行(CreateThreadpoolWait)

最初始的模板 #include <stdio.h> #include <Windows.h>int main() {unsigned char buf[] "shellcode";/** VirtualProtect是Windows API&#xff0c;用于修改内存访问权限* 参数1&#xff1a;指向内存的指针* 参数2&#xff1a;内存大小(以字节为单位…