【算法】JAVA刷算法必备数据结构

文章目录

  • 数组List
  • 队列和栈
  • 栈的应用:表达式求值


数组List

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
ArrayList 继承了 AbstractList ,并实现了 List 接口。
在这里插入图片描述
具体使用:
定义:

import java.util.*;
List<E> list = new ArrayList<>();

E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型

已经封装可以直接调用的方法:

  • 变量名.add(数据) :向尾部插入数据
  • 变量名.get(i) :通过下标访问数据
  • 变量名.set(i, 数据):第一个参数为索引位置,第二个为要修改的值
  • 变量名.remove(i) :删除下标为i的数据
  • 变量名.size() :返回容器元素个数
  • Collections.sort(变量名) :排序
  • contains():判断元素是否在 arraylist
  • isEmpty():判断 arraylist 是否为空
  • subList():截取部分 arraylist 的元素
import java.util.*;/*** @ClassName Main* @Description TODO* @Author 小何* @Date 2024/9/23 22:46**/
public class Main {public static void main(String[] args) {List<Integer> list = new ArrayList<>();// 添加数据list.add(3);list.add(4);list.add(1);list.add(2);list.add(6);System.out.println(list.toString()); // [3, 4, 1, 2, 6]// 修改数据list.set(2, 7);System.out.println(list.toString()); // [3, 4, 7, 2, 6]// 删除数据list.remove(list.size() -1);System.out.println(list.toString()); // [3, 4, 7, 2]// 反转Collections.reverse(list);System.out.println(list.toString()); // [2, 7, 4, 3]// 排序Collections.sort(list);System.out.println(list.toString()); // [2, 3, 4, 7]// 排序 大-》小Collections.sort(list, Collections.reverseOrder());System.out.println(list.toString()); // [7, 4, 3, 2]list.add(9);Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});System.out.println(list.toString()); // [9, 7, 4, 3, 2]// 是否包含某个元素System.out.println(list.contains(8)); // false// 截取List<Integer> subList = list.subList(1, 3);System.out.println(subList.toString());// [7, 4]}
}

队列和栈

队列:先进先出
栈:先进后出
LinkedList 实现了 Queue 接口等,可作为队列使用,也可以当作栈使用。
在这里插入图片描述
具体使用:

import java.util.LinkedList;
LinkedList<E> list = new LinkedList<>();

已经封装可以直接调用的方法:

  • 添加元素add
  • 尾部添加元素addLast
  • 头部添加元素addFirst
  • 移除头部元素removeFirst
  • 移除尾部元素removeLast
  • 获取头部元素getFirst
  • 获取元素 iget(i)

具体队列很栈的实现:

import java.util.*;/*** @ClassName Main* @Description TODO* @Author 小何* @Date 2024/9/23 22:46**/
public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(4);list.add(1);list.add(3);list.add(6);list.add(2);System.out.println(list.toString());// 在尾部添加元素list.addLast(8);// 在头部添加元素list.addFirst(9);System.out.println(list.toString()); //[9, 4, 1, 3, 6, 2, 8]// 移除头部元素list.removeFirst();System.out.println(list.toString()); // [4, 1, 3, 6, 2, 8]// 移除尾部元素list.removeLast();System.out.println(list.toString()); // [4, 1, 3, 6, 2]// 获取头部元素System.out.println(list.getFirst()); // 4// 获取尾部元素System.out.println(list.getLast()); // 2// 获取元素 iSystem.out.println(list.get(2)); // 3// 队列 queue 先进先出LinkedList<Integer> queue = new LinkedList<>();// 入队queue.add(1);queue.add(2);queue.add(3);System.out.println(queue.toString()); // [1, 2, 3]// 出队queue.removeFirst();System.out.println(queue.toString()); // [2, 3]// 访问队首元素System.out.println(queue.getFirst()); // 2// 访问队尾元素System.out.println(queue.getLast()); // 3// 队列元素System.out.println(queue.size()); // 2// 栈 stack 先进后出LinkedList<Integer> stack = new LinkedList<>();// 入栈stack.add(4);stack.add(6);stack.add(2);stack.add(1);stack.add(3);stack.add(5);System.out.println(stack.toString()); // [4, 6, 2, 1, 3]// 出栈stack.removeLast();System.out.println(stack.toString()); // [4, 6, 2, 1, 3]// 访问栈顶System.out.println(stack.getLast());// 3// 栈元素个数System.out.println(stack.size()); // 5}
}

同时JAVA提供了专门的栈实现Stack类:

public class Main {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1);stack.push(2);stack.push(3);stack.push(4);System.out.println(stack);System.out.println(stack.peek()); // 4 栈顶System.out.println(stack.pop()); // 4 出栈System.out.println(stack.peek()); // 3System.out.println(stack.size()); // 3}
}

栈的应用:表达式求值

对于中缀表达式求值,需要定义两个栈:数字栈和符号栈,顾名思义分别存放数字和符号。

  1. 遇到数字,直接入数字栈,需要注意并不是只有个位数,还是需要一定的处理,详情见代码。
  2. 遇到符号,有三种情况:
  • 左括号(:直接入符号栈。
  • 右括号):取两个数字栈的数据,取一个符号栈的数据,计算结果放入数字栈,循环直到符号栈中取出(结束。
  • ±*/运算符:符号栈为空,直接入符号栈,不为空则需要比较当前的运算符和符号栈栈顶元素的优先级,当栈顶元素优先级大于等于当前的运算符,符号栈出栈,取两个数字栈元素进行计算,结果放入数字栈,循环,将所有大于等于当前的运算符的全部出栈为止。
  1. 最后的计算结果为数字栈的栈顶元素。

提前使用map集合定义好优先级:

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;public class Main {public static void main(String[] args) {String str = "2*(3+5)+7/1-4"; // 中缀表达式Stack<Integer> nums = new Stack<>(); // 数字栈Stack<Character> ops = new Stack<>(); // 符号栈// 符号优先级Map<Character, Integer> map = new HashMap<>();map.put('+', 1);map.put('-', 1);map.put('*', 2);map.put('/', 2);map.put('(', 0);char[] array = str.toCharArray();int i = 0;while (i < array.length) {// 遇到数字 直接入栈if (Character.isDigit(array[i])) {int sum = 0;while (i < array.length && Character.isDigit(array[i])) {sum = sum * 10 + (array[i] - '0');i++;}nums.push(sum);continue; // 继续到下一个字符}// 遇到符号if (array[i] == '(') {ops.push(array[i]);} else if (array[i] == ')') {// 出栈直到遇到左括号while (ops.peek() != '(') {performOperation(nums, ops);}ops.pop(); // 弹出左括号} else {// 运算符:比较优先级while (!ops.isEmpty() && map.get(ops.peek()) >= map.get(array[i])) {performOperation(nums, ops);}ops.push(array[i]);}i++;}// 处理剩余的运算符while (!ops.isEmpty()) {performOperation(nums, ops);}System.out.println(nums.pop());}private static void performOperation(Stack<Integer> nums, Stack<Character> ops) {int b = nums.pop();int a = nums.pop();char op = ops.pop();switch (op) {case '+': nums.push(a + b); break;case '-': nums.push(a - b); break;case '*': nums.push(a * b); break;case '/':// 注意:除以零的情况if (b == 0) throw new ArithmeticException("Division by zero");nums.push(a / b); break;}}
}

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

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

相关文章

Nest.js实现一个简单的聊天室

本文将介绍如何使用 Nest.js 和 Uni-app 实现一个简单的实时聊天应用。后端使用 nestjs/websockets 和 socket.io&#xff0c;前端使用 uni-app 并集成 socket.io-client。这个项目允许多个用户同时加入聊天并实时交换消息。 效果图&#xff1a; 一、准备工作 安装 Node.js 和…

DAF-Net:一种基于域自适应的双分支特征分解融合网络用于红外和可见光图像融合

论文 DAF-Net: A Dual-Branch Feature Decomposition Fusion Network with Domain Adaptive for Infrared and Visible Image Fusion 提出了一种新的红外和可见光图像融合方法。该方法旨在结合红外图像和可见光图像的互补信息&#xff0c;以提供更全面的场景理解。红外图像在低…

学习C++的第七天!

1.虚函数是在基类中用 virtual 关键字声明的函数&#xff0c;可以在派生类中被重写。纯虚函数是在虚函数的基础上&#xff0c;在基类中被初始化为 0 的函数&#xff0c;含有纯虚函数的类是抽象类&#xff0c;不能被实例化。 2.如果基类的析构函数不是虚函数&#xff0c;当通过…

现代cpp多线程与并发初探

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 在现代c(c20)中,有了jthread和协程的概念,使得我们编写并发程序更加方便. 这里作简单学习. 前言知识 多线程编程 std::thread 用于创建一个执行的线程实例,所以它是一切并发编程的基础,使用时需要包含 <thread…

Android个性名片界面的设计——约束布局的应用

节选自《Android应用开发项目式教程》&#xff0c;机械工业出版社&#xff0c;2024年7月出版 做最简单的安卓入门教程&#xff0c;手把手视频、代码、答疑全配齐 【任务目标】 使用约束布局、TextView控件实现一个个性名片界面的设计&#xff0c;界面如图1所示。 图1 个性名片…

Transformer 算法模型详解

核心点&#xff1a;完整讲解Transformer模型&#xff01; 让我们用简单的语言来解释&#xff1a;想象一下&#xff0c;你正在阅读一本书&#xff0c;书中的每个字都很重要。但如果你每次只能关注一个字&#xff0c;理解整本书就会变得很慢。而Transformer模型就像是赋予你超能…

从密码学看盲拍合约:智能合约的隐私与安全新革命!

文章目录 前言一、什么是盲拍合约&#xff1f;二、盲拍合约的优势1.时间压力的缓解2.绑定与秘密的挑战 三、盲拍合约的工作原理1.提交盲出价2.披露出价3.结束拍卖4.退款机制 四、代码示例总结 前言 随着区块链技术的发展&#xff0c;智能合约在各种场景中的应用越来越广泛。盲…

基于Hive和Hadoop的病例分析系统

本项目是一个基于大数据技术的医疗病历分析系统&#xff0c;旨在为用户提供全面的病历信息和深入的医疗数据分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…

Linux入门2——初识Linux权限

目录 0. Linux下的用户 1.文件访问者的分类 2.文件类型和访问权限 3. 文件权限值的表示方法 4.文件访问权限的相关设置方法 4.1 修改文件的访问权限 4.2修改文件的拥有者和所属组 0. Linux下的用户 在学习Linux权限之前&#xff0c;我们要先来了解Linux下的用户&#x…

vue+UEditor附件上传问题

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

端口隔离配置的实验

端口隔离配置是一种网络安全技术&#xff0c;用于在网络设备中实现不同端口之间的流量隔离和控制。以下是对端口隔离配置的详细解析&#xff1a; 基本概念&#xff1a;端口隔离技术允许用户将不同的端口加入到隔离组中&#xff0c;从而实现这些端口之间的二层数据隔离。这种技…

算法记录——链表

2.链表 2.1判断是否是回文链表 1.方法一&#xff1a;利用栈反转链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode…

Invalid Executable The executable contains bitcode

Invalid Executable The executable contains bitcode 升级xcode16后&#xff0c;打包上传testflight时三方库报错&#xff1a;Invalid Executable - The executable ***.app/Frameworks/xxx.framework/xxx contains bitcode. 解决方案&#xff1a; 执行一下指令删除该framew…

软件测试学习路线图

软件测试工程师是专门从事软件、系统或产品测试和评估的技术专业人士&#xff0c;确保它们符合既定标准并无任何缺陷。通过精心设计和执行测试计划&#xff0c;软件测试工程师发现 Bug、故障和需要改进的领域&#xff0c;从而提高最终产品的可靠性和性能。 软件测试工程师在软…

Awcing 799. 最长连续不重复子序列

Awcing 799. 最长连续不重复子序列 解题思路: 让我们找到一个数组中&#xff0c;最长的 不包含重复的数 的连续区间的长度。 最优解是双指针算法&#xff1a; 我们用 c n t [ i ] cnt[i] cnt[i]记录 i i i 这个整数在区间内出现的次数。(因为每个数的大小为 1 0 5 10^5 105, …

状态模式原理剖析

《状态模式原理剖析》 状态模式&#xff08;State Pattern&#xff09; 是一种行为设计模式&#xff0c;它允许对象在其内部状态改变时改变其行为。换句话说&#xff0c;当对象状态发生变化时&#xff0c;它的行为也会随之变化。 通过状态模式&#xff0c;可以消除通过 if-else…

从“可用”到“好用”,百度智能云如何做大模型的“超级工厂”?

如果说&#xff0c;过去两三年大模型处于造锤子阶段&#xff0c;那么今年&#xff0c;更多的则是考验钉钉子的能力&#xff0c;面对各类业务场景大模型是否能够有的放矢、一击必中&#xff0c;为千行百业深度赋能。 当前市场上&#xff0c;已经有200多把这样的锤子在疯狂找钉子…

【unity进阶知识1】最详细的单例模式的设计和应用,继承和不继承MonoBehaviour的单例模式,及泛型单例基类的编写

文章目录 前言一、不使用单例二、普通单例模式1、单例模式介绍实现步骤&#xff1a;单例模式分为饿汉式和懒汉式两种。 2、不继承MonoBehaviour的单例模式2.1、基本实现2.2、防止外部实例化对象2.3、最终代码 3、继承MonoBehaviour的单例模式3.1、基本实现3.2、自动创建和挂载单…

OCR 行驶证识别 离线识别

目录 正页识别 副页识别 全部识别 OCR 行驶证识别 离线识别 正页识别 副页识别 全部识别

电脑学习通看不到课程解决办法

电脑学习通看不到课程解决办法 查看学习通时发现没有课程 解决方法1: 更改单位 具体见:超星学习通关于PC版无法查看课程问题解决 解决方法二:添加应用 添加应用 点击账号管理 点击应用管理 添加应用、添加首页这个应用 添加完成后查看首页就能看到课程了 然后就OK啦、就可…