数据结构文章目录
一、什么是数据结构
1.数据结构的起源
1968年,美国的高纳得教授开设了一门基本算法的课程,开设了数据结构的先河。
数据结构:研究数据之间关系和操作的科学,而不是计算方法。 数据结构 + 算法 = 程序, 沃思 -> 图灵奖 程序: 可执行的二进制指令
2.数据结构的基本概念
数据: 所有能够输入到计算机中去描述事物的符号
数据元素: 数据的基本单位也叫作节点\顶点\记录.
数据项:有独立含义的数据最小单位,也叫做域.数据结构:数据元素和数据关系的集合 算法: 数据结构所具备的功能,解决特定问题的方法
二、逻辑结构和存储结构
什么是逻辑结构:
集合:数据元素同属于一个集合,但是元素之间没有任何的关系
线性结构:数据元素之间存在一对一的关系.(表)
树型结构:数据元素之间存在一对多的关系.(倒悬树)
图型结构:数据元素之间存在多对多的关系.(地图)
什么是存储(物理)结构:
顺序结构:
数据存储在连续的内存中,用数据元素的相对位置来表示
链式结构:
数据元素存储在彼此独立的内存空间中,每个独立的元素也叫做节点,每个数据元素中增加一个数据项用来存储其他元素的地址,用来表示元素之间的关系.
逻辑结构和物理结构的对应关系:
表 顺序 链式
树 顺序 链式
图 顺序+链式
每种逻辑结构采用什么物理结构存储并没有明确规定,通常根据实际难度程度以及空间\时间来要求.
三、数据结构和运算
创建
增
删
改
查
清除
插入
排序
遍历
实现ArrayList LinkedList
集合
顺序 链表 栈 队列 二叉树
顺序结构(ArrayList):
底层实现:数组
底层数据结构:数组
特点:
优点: 查询速度很快(因为有连续的下标,可以根据下标进行查询)
缺点:
a.插入/删除很慢的
b.顺序结构需要连续的物理空间
导致空间的使用率非常低
实例:
实现的功能:
对数据的增删改查
1.向集合(this)中末尾添加元素
2.向集合index的位置中插入obj元素
3.删除指定位置(index)上的元素,并且返回删除的元素
4.删除第一个指定元素(obj)
5.替换指定位置上的元素,替换成obj,并且返回被替换的元素
6.从集合中获得指定位置(index)的元素
7.获得集合中的元素个数
8.判断集合中是否存在指定元素obj
9.判断集合是否为空:没有有效元素是空
10.打印出在集合中的有效元素
package ArrayList;
import java.util.Arrays;
/*
顺序结构手动实现 - ArrayList(线性结构)
底层实现:数组
目的: 让外边的类看来,他是一个可变长的数组
数组的扩容
*/
public class MyArrayList {
/*
对数据的增删改查
1.向集合(this)中末尾添加元素
2.向集合index的位置中插入obj元素
3.删除指定位置(index)上的元素,并且返回删除的元素
4.删除第一个指定元素(obj)
5.替换指定位置上的元素,替换成obj,并且返回被替换的元素
6.从集合中获得指定位置(index)的元素
7.获得集合中的元素个数
8.判断集合中是否存在指定元素obj
9.判断集合是否为空:没有有效元素是空
10.打印出在集合中的有效元素
*/
//初始化一个数组
private Object [] arr=new Object[3];
//用来表示有效位数
protected int size=0;
//9.判断集合是否为空:没有有效元素是空
public boolean isEmpy(){
if (size==0){
return true;
}
return false;
}
//8.判断集合中是否存在指定元素obj
public boolean contain(Object obj){
for (int i = 0; i <size ; i++) {
if (arr[i].equals(obj)){
return true;
}/*else {
return false;
}*/
}
return false;
}
//7.获得集合中的元素个数
public int count(){
return size;
}
//6.从集合中获得指定位置(index)的元素
public Object get(int index){
Object o = arr[index];
return o;
}
// 5.替换指定位置上的元素,替换成obj,并且返回被替换的元素
public Object set(int index,Object obj){
Object o = arr[index];
arr[index]=obj;
return o;
}
//4.删除一个指定元素(obj)
public void remove(Object obj){
for (int i = 0; i <size ; i++) {
//比较元素是否相等
if (arr[i].equals(obj)){
//如果相等就删除这个位置上的元素
// remove1(i);
for (int j = 0; j < size; j++) {
arr[i]=arr[i+1];
}
break;
}
}
size--;
}
// 3.删除指定位置(index)上的元素,并且返回删除的元素
public Object remove1(int index){
//index超出范围
if (index<0 || index>size-1){
return null;
}
//提前保存指定位置上的元素
Object o=arr[index];
//从index位置后面的元素全部都向前移
for (int i = index; i < size; i++) {
arr[i]=arr[i+1];
}
//数组长度-1
size--;
//返回被删除的元素
return o;
}
//2.向集合index的位置中插入obj元素
public void add(int index,Object obj){
//index超出范围
if (index<0 || index>size-1){
return ;
}
//对数组进行扩容
if (size==arr.length){
arr=Arrays.copyOf(arr,arr.length+3);
}
//将index位置后面的数据往后移动
//进入循环的条件:i=size-1
//进行循环满足的条件:i >=index
for (int i = size-1; i >=index ; i--) {
//数据往后移动
arr[i+1]=arr[i];
}
arr[index]=obj;
size++;//有效位+1
}
// 1.向集合(this)中末尾添加元素
public void add(Object obj){
//当有效位数==数组长度
if (size==arr.length){
//对数组进行扩容
arr= Arrays.copyOf(arr,arr.length+3);
}
//把新增的元素赋值给尾
arr[size]=obj;
//有效位+1
size++;
}
//10.打印出在集合中的有效元素
//重写toString的方法
public String toString(){
StringBuilder str = new StringBuilder("[");
//输出数组有效位
for (int i = 0; i <size ; i++) {
str.append(arr[i]+",");
}
//对最后一位,进行删除
str.deleteCharAt(str.length()-1);
str.append("]");
return str.toString();
}
}
package ArrayList;
public class MyArrayListTest {
public static void main(String[] args) {
MyArrayList list = new MyArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("haha");
list.add("haha");
list.add("haha");
list.add("haha");
list.add(3,"杨");
System.out.println(list);
list.remove1(2);
System.out.println(list);
list.remove("1");
System.out.println(list);
}
}