简洁笔记-Java数据结构基础(2.线性结构)-(参考java数据结构罗召勇老师课程)
2022/1/1 17:08:10
本文主要是介绍简洁笔记-Java数据结构基础(2.线性结构)-(参考java数据结构罗召勇老师课程),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
线性结构
知识点包括1.数组2.栈3.队列4.单链表5.循环链表6.双链表7.递归8.排序算法
1.数组
(1)数组的基本使用
public class Ex01 { public static void main(String[] args) { int[] arr1 = new int[3]; //动态初始化数组长度,长度一旦定义,不可变 int length1 = arr1.length; //获取数组的长度 System.out.println(length1); //输出数组长度:3 //手动给数组的3个元素赋值 arr1[0] = 0; arr1[1] = 1; arr1[2] = 2; //获取数组的第0个元素,即索引为0 int element0 = arr1[0]; System.out.println(element0); //输出:0 //遍历数组,输出全部数组的元素,适用于有多个元素 for(int i = 0;i < arr1.length;i++) { System.out.println(arr1[i]); } int[] arr2 = new int[] {0,1,2,3,4,};//静态初始化数组长度及元素,长度一旦定义,不可变 System.out.println(arr2.length); //输出:5 //遍历数组,输出全部数组的元素,适用于有多个元素 for(int i = 0;i < arr2.length;i++) { System.out.println(arr2[i]); } } }
(2).数组元素的添加
解决数组长度一旦定义就不可变的方法:直接创建一个长度比原有数组大的新数组,获取原数组的元素
//想再添加一个元素:77,原有数组长度不够,增长数组长度 /*思路:原数组添加元素:创建比原数组长的新数组, 新数组获取原数组的元素,在新数组处添加新元素, 最后把新数组的内存地址赋给旧数组*/ import java.util.Arrays; public class Ex01 { public static void main(String[] args) { int[] arr = new int[3]; //动态初始化数组长度 //手动给数组的3个元素赋值 arr[0] = 0; arr[1] = 1; arr[2] = 2; int newElement = 77; //需要添加的目标新元素 //创建一个比原有数组长度多一的新数组 int[] newArr = new int[arr.length+1]; for(int i = 0;i < arr.length;i++) { //遍历使新数组获取旧数组的元素 newArr[i] = arr[i]; } //把目标元素放于新数组的最后一位 newArr[arr.length] = newElement; System.out.println(Arrays.toString(newArr)); //方法Arrays.toString(数组),输出数组元素 //newArr的内存地址赋值给arr System.out.println("arr增长前数组元素:" + Arrays.toString(arr)); arr = newArr; System.out.println("arr增长后数组元素:" +Arrays.toString(arr)); } }
(3)数组元素的删除
//删除数组指定元素 /*思路:原数组删除指定元素:创建长度比原数组短的新数组, 遍历给新数组赋值,除了旧数组的指定删除元素*/ import java.util.Arrays; public class Ex01 { public static void main(String[] args) { //静态初始化原数组 int[] arr = new int[] {11,22,33,44,55,66}; int muBiao = 3; //删除数组的第四个元素,即索引为3 //创建一个长度小1的新数组来存储原数组指定元素被删后的所有元素 int[] newArr = new int[arr.length - 1]; //遍历给newArr赋值,除了目标删除元素 for(int i = 0;i < newArr.length;i++) { //如果i小于目标索引,则newArr正常赋值 if(i < muBiao) newArr[i] = arr[i]; //否则newArr[i] = arr[i+1]这样赋值 else newArr[i] = arr[i + 1]; } System.out.println("删除元素前的arr数组:"+Arrays.toString(arr)); arr = newArr; System.out.println("删除元素后的arr数组:"+Arrays.toString(arr) ); } }
(4)面向对象的数组
import java.util.Arrays; //用面向对象的思想,自定方法,把获得数组长度、打印数组、增加、删除、插入、返回元素功能封装在一起 public class MyArr { private int[] arr;//用于存储数据的数组 public MyArr() {//MyArr构造器 arr = new int[0]; } //自定义方法1:得到数组的长度 public int size() { return arr.length; } //自定义方法2:打印数组 public void show() { System.out.println("数组为:"+Arrays.toString(arr)); } //自定义方法3:增加元素,往末尾添加一个元素 public void add(int element) { //创建一个比原数组长度+1的新数组用于存储 int[] newArr = new int[arr.length+1]; for(int i = 0;i < arr.length;i++) { newArr[i] = arr[i]; } //需要添加的元素赋值 newArr[arr.length] = element; //新数组替换旧数组 arr = newArr; } //自定义方法4:删除元素,删除数组指定元素 public void delete(int index) { //创建一个比原数组长度-1的新数组用于存储 int[] newArr = new int[arr.length-1]; for(int i = 0;i < newArr.length;i++) { if(i < index) newArr[i] = arr[i]; else newArr[i] = arr[i+1]; } //新数组替换旧数组 arr = newArr; } //自定义方法5:插入元素,在指定位置插入元素 public void insert(int index,int element) { //创建长度+1的新数组存储旧数组 int[] newArr = new int[arr.length+1]; //判定条件 for(int i = 0;i < newArr.length;i++) { if(i < index) { newArr[i] = arr[i]; }else if(i == index) { newArr[i] = element; }else { newArr[i] = arr[i-1]; } } //新数组替换旧数组 arr = newArr; } //自定义方法6:返回指定索引的数组元素 public int getElement(int index) { return arr[index]; } //自定义方法7:替换指定位置的元素 public void set(int index,int element) { arr[index] = element; } }
import java.util.Arrays; public class Test { public static void main(String[] args) { MyArr myArr = new MyArr(); //调用size()方法,输出数组长度 System.out.println("数组长度为:"+myArr.size());//输出结果:数组长度为:0 //测试增加元素是否成功 myArr.add(1); myArr.add(2); //调用size()方法,输出调用add()方法增加元素后的数组长度 System.out.println("数组长度为:"+myArr.size()); //输出结果:数组长度为:2 //输出未删除时数组元素情况 myArr.show(); //输出结果:数组为:[1, 2] myArr.delete(0);//删除数组索引为0的元素 //输出删除后数组元素情况 myArr.show(); //输出结果:数组为:[2] //测试插入元素方法insert(),在索引0的地方插入77 myArr.insert(0, 77); myArr.show(); //输出结果:数组为:[77, 2] //在索引1的地方插入88 myArr.insert(1, 88); myArr.show(); //输出结果:数组为:[77, 88, 2] //在索引3的地方插入99 myArr.insert(3, 99); myArr.show();//输出结果:数组为:[77, 88, 2, 99] //测试getElement方法,返回索引为3的数组元素 System.out.println(myArr.getElement(3));//输出结果:99 //测试set()方法,替换指定元素 myArr.set(3, 98); System.out.println(myArr.getElement(3));//输出结果:98 } }
(5).查找算法-线性查找
//线性查找的方法,返回所需要搜索的元素下下标 //思路:一个一个顺序地查就是线性查找 public class Test { public static void main(String[] args) { // 静态初始化数组 int[] arr = new int[] {11,22,33,44,55,66,77}; // 假定搜索目标元素为33 int target = 33; // 假定没有目标元素则返回索引-1 int index = -1; // 循环一个一个元素地去判断 for(int i = 0;i < arr.length;i++) { if(arr[i] == target) index = i; } System.out.println("目标索引为:"+index); } }
(6).查找算法-二分法查找
//用二分法查找指定数组元素,返回该元素的索引(前提是数组元素小到大有序排序) /*思路:对半对半的判断,先用一个int middle变量来划分,判断arr[middle]和目标元素target的大小关系 (1).若arr[middle] > target,则说明target在arr[middle]的左方,向左对半对半找 (2).若arr[middle] < target,则说明target在arr[middle]的右方,向右对半对半找 (3).若arr[middle] == target,则说明target就是arr[middle],放回middle就是该元素的索引 注意middle可以动态变化跟着变化着的begin和end,具体思路看代码 实现方法如下: */ public class Test { public static void main(String[] args) { //静态初始化数组 int[] arr = new int[] {11,22,33,44,55,66,77,88}; //假定需要找的目标元素为33 int target = 33; //存储目标元素的索引,默认为未找到,返回值为-1 int index = -1; //初始化定义变量begin,end,middle的关系,进而middle=(begin+end)/2 int begin = 0,end = arr.length - 1,middle = (begin+end)/2; //弄一个while(true)的循环来实现不断地对半搜索判断 while(true) { //判断找不到的条件,begin>end的时候不能取=,因为begi =end的时候有可能就是目标索引 if(begin > end) { break; } //说明target就是arr[middle],放回middle就是该元素的索引 if(arr[middle] == target) { index = middle; break;//跳出循环 } if(arr[middle] > target) { //target在arr[middle]的左方,向左对半对半找,此时end的值要改为middle-1的值 //因为arr[middle] 不等于 target,所以排除middle这个索引,改成middle - 1 end = middle - 1; //新的middle值 middle = (begin+end)/2; } if(arr[middle] < target) { //target在arr[middle]的右方,向右对半对半找,此时begin的值要改为middle的值 //此时同理 begin = middle + 1 begin = middle + 1; //新的middle值 middle = (begin+end)/2; } } System.out.println("所查找的元素索引为:"+index); //输出结果:所查找的元素索引为:2 } }
这篇关于简洁笔记-Java数据结构基础(2.线性结构)-(参考java数据结构罗召勇老师课程)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南