01、(ArrayList)线性结构(数组的扩容)

一、什么是数据结构

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值