一、数据结构与算法概述
1.数据结构概述
(1)什么是数据结构?
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
(2)数据的存储结构
分为顺序存储结构和链式存储结构
(3)数据的逻辑结构
集合 无关系
线性结构 一对一
树形结构 一对多
图形结构 多对多
2.算法概述
(1)算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
(2)特性
a输入:算法具有零个或多个输入
b输出:算法至少有一个或多个输出
c有穷性:算法在执行有限的步骤之后,会自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成
d确定性:算法的每一个步骤都具有确定的意义,不会出现二义性
e可行性:算法的每一步都必须是可行的,每一步都能通过执行有限次数完成
(3)基本要求
正确性
可读性
健壮性
时间复杂度
空间复杂度
二、线性结构
1.线性结构都包括
数组、栈、队列、单链表、循环链表、双链表、递归、排序算法
2.数组:顺序存储
package com.xianxing.array;
public class ArrayTest {
public static void main(String[] args) {
// 创建一个数组
int[] arr1 = new int[3];
// 获取数组长度
int length1 = arr1.length;
System.out.println("arr1数组的长度:" + length1);
// 访问数组中的元素:数组名[下标] 注意:下标从0开始
int element0 = arr1[0];
System.out.println("arr1第0个元素:" + element0);
// 为数组中的元素赋值
for (int i = 0; i < arr1.length; i++) {
arr1[i] = 100 - i;
}
// 遍历数组
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i] + " ");
}
System.out.println();
// 增强型for循环
for (int n : arr1) {
System.out.print(n + " ");
}
System.out.println();
// 创建数组的同时为数组中的元素赋值
int[] arr2 = new int[] { 90, 80, 70, 60, 50 };
// 获取数组的长度
System.out.println("数组arr2的长度为:" + arr2.length);
}
}
package com.xianxing.array;
import java.util.Arrays;
/**
* 为数组添加元素
*
* @author l1
*
*/
public class ArrayTest1 {
public static void main(String[] args) {
// 数组的长度不可变
int[] arr = new int[] { 9, 8, 7 };
// 快速查看数组中的元素
System.out.println(Arrays.toString(arr));// [9, 8, 7]
int dst = 6;
// 创建一个新数组,长度是原数组长度+1
int newArr[] = new int[arr.length + 1];
// 把原数组中的数据全部复制到新数组中
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
System.out.println(Arrays.toString(newArr));// [9, 8, 7, 0]
// 把目标元素放入新数组最后
newArr[arr.length] = dst;
System.out.println(Arrays.toString(newArr));// [9, 8, 7, 6]
// 新数组替换原数组
arr = newArr;
System.out.println(Arrays.toString(arr));// [9, 8, 7, 6]
}
}
package com.xianxing.array;
import java.util.Arrays;
/**
* 删除数组中的元素
*
* @author l1
*
*/
public class ArrayTest2 {
public static void main(String[] args) {
// 目标数组
int[] arr = new int[] { 9, 8, 7, 6, 5 };
// 要删除的数组下标
int dst = 2;
System.out.println(Arrays.toString(arr));
// 创建一个新数组,长度为原数组-1
int newArr[] = new int[arr.length - 1];
// 复制原数组中除了要删除的元素以外的元素
for (int i = 0; i < newArr.length; i++) {
if (i < dst) {
// 要删除的元素下标之前的元素
newArr[i] = arr[i];
} else {
// 要删除的元素之后的元素
newArr[i] = arr[i + 1];
}
}
// 新数组替换旧数组
arr = newArr;
System.out.println(Arrays.toString(arr));
}
}
package com.xianxing.array1;
import java.util.Arrays;
import javax.management.RuntimeErrorException;
/**
* 面向对象数组
*
* @author l1
*
*/
public class MyArray {
// 用于存储数据的数组
private int[] elements;
public MyArray() {
elements = new int[0];
}
// 获取数组长度
public int size() {
return elements.length;
}
// 往数组末尾添加一个元素
public void add(int element) {
int newArr[] = new int[elements.length + 1];
for (int i = 0; i < elements.length; i++) {
newArr[i] = elements[i];
}
newArr[elements.length] = element;
elements = newArr;
}
// 打印所有元素
public void show() {
System.out.println(Arrays.toString(elements));
}
// 删除一个元素
public void delete(int index) {
// 判断下标是否越界
if (index < 0 || index > elements.length - 1) {
throw new RuntimeException("下标越界");
}
int[] newArr = new int[elements.length - 1];
for (int i = 0; i < newArr.length; i++) {
if (i < index) {
newArr[i] = elements[i];
} else {
newArr[i] = elements[i + 1];
}
}
elements = newArr;
}
// 获取某个下标的元素
public int get(int index) {
// 判断下标是否越界
if (index < 0 || index > elements.length - 1) {
throw new RuntimeException("下标越界");
}
return elements[index];
}
// 插入一个元素到指定位置
public void insert(int index, int element) {
// 判断下标是否越界
if (index < 0 || index > elements.length - 1) {
throw new RuntimeException("下标越界");
}
int newArr[] = new int[elements.length + 1];
for (int i = 0; i < newArr.length - 1; i++) {
if (i < index) {
newArr[i] = elements[i];
} else {
newArr[i + 1] = elements[i];
}
}
newArr[index] = element;
elements = newArr;
}
// 替换指定的元素
public void set(int index, int element) {
// 判断下标是否越界
if (index < 0 || index > elements.length - 1) {
throw new RuntimeException("下标越界");
}
elements[index] = element;
}
}
package com.xianxing.array1;
public class MyArrayTest {
public static void main(String[] args) {
MyArray ma = new MyArray();
System.out.println("ma数组的长度:" + ma.size());// ma数组的长度:0
ma.show();// []
ma.add(3);
ma.add(6);
ma.add(99);
ma.add(95);
System.out.println("ma数组的长度:" + ma.size());// ma数组的长度:4
ma.show();// [3, 6, 99, 95]
ma.delete(1);
ma.show();// [3, 99, 95]
System.out.println(ma.get(1));// 99
ma.add(55);
ma.add(36);
ma.show();// [3, 99, 95, 55, 36]
ma.insert(3, 86);
ma.show();// [3, 99, 95, 86, 55, 36]
ma.set(4, 64);
ma.show();// [3, 99, 95, 86, 64, 36]
}
}