1线性表的顺序存储——数组(手工实现)

线性表:零个或多个数据元素的有限序列

线性表是逻辑结构,根据其物理结构的不同分为顺序结构(数组)和链式存储结构(链表)

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素

手写数组

类结构图

1线性表的顺序存储——数组(手工实现)_第1张图片

arraylist实现demo

package com.company.datastructure;

public class MyArrayList {
    //fields
    private Object[] elementData;  //底层是数组,用来保存数据
    private int size;  //存放线性表当前元素个数

    private final int DEFAULT_SIZE = 10;  //默认数组长度为10

    //constructor
    public  MyArrayList(int initsize){
        if(initsize>=0){
            elementData = new Object[initsize];
        }else{
            throw new IllegalArgumentException("初始长度不正确"+ initsize);
        }
    }
    public MyArrayList(){
        elementData = new Object[DEFAULT_SIZE];  //没有输入默认构造长度为10的数组
    }

    //methods
    //增加
    /**
     * 末尾添加元素
     * @param element 要添加的添加元素
     * @return 添加成功返回true
     */
    public boolean add(E element){
        ensureCapacity();
        elementData[size] = element;
        size++;
        return true;
    }

    /**
     * 指定位置添加元素
     * @param index 索引
     * @param element 元素
     * @return 添加成功返回true
     */
    public boolean add(int index,E element){
        rangeCheck(index);
        ensureCapacity();
        System.arraycopy(elementData,index,elementData,index+1,size-index);
        elementData[index] = element;
        size++;
        return true;
    }
    //删除
    /**
     * 删除索引位置处元素
     * @param index
     * @return 删除元素值
     */
    public E remove(int index){
        rangeCheck(index);
        E oldValue = (E) elementData[index];
        System.arraycopy(elementData,index+1,elementData,index,size-index);
        size--;
        return oldValue;
    }
    public boolean remove(Object o){
        for (int i = 0; i < elementData.length; i++) {
            if (o.equals(elementData[i])){
                System.arraycopy(elementData,i+1,elementData,i,size-i);
                size--;
                return true;
            }
        }
        return false;
    }
    //修改
    /**
     * 根据索引修改元素值
     * @param index 索引
     * @param element 新元素值
     * @return 旧元素值
     */
    public E set(int index,E element){
        rangeCheck(index);
        E oldValue = (E) elementData[index];
        elementData[index] = element;
        return oldValue;
    }
    //查找

    /**
     * 根据索引获得元素值
     * @param index 索引
     * @return 元素值
     */
    public E get(int index){
        rangeCheck(index);
        return (E) elementData[index];
    }
    /*--------------------------------------其他功能----------------------------------------------*/
    //数组长度
    public int size(){
        return size;
    }
    //是否为空
    public boolean isEmpty(){
        return size==0?true:false;
    }
    //toString方法
    @Override
    public String toString() {
        if(size==0){
            return "[]";
        }else{
            StringBuilder sb = new StringBuilder();
            sb.append("[");
            for (int i = 0; i < size; i++) {
                sb.append(elementData[i]+",");
            }
            int len = sb.length();
            return sb.delete(len-1,len).append("]").toString();
    }
    }

    /*------------------------------------------------------------------------------------*/
    /**
     * 数组扩容
     */
    private void ensureCapacity(){
        if(elementData.length-1>=size){
            Object[] newArray = new Object[elementData.length+(elementData.length>>1)];  //右移一位相当于除以2
            System.arraycopy(elementData,0,newArray,0,elementData.length);  //数组拷贝
            elementData = newArray;
        }
    }

    /**
     * 索引检查
     * @param index 索引
     */
    private void rangeCheck(int index){
        if(index<0||index>=size){
            throw new IndexOutOfBoundsException("索引不合法"+index);
        }
    }

}

 测试demo

package com.company.datastructure;

public class TestMyArrayList {
    public static void main(String[] args) {
        MyArrayList mal = new MyArrayList<>();
        for (int i = 0; i < 20; i++) {
            mal.add("chen"+i);
        }
        System.out.println(mal);
        mal.add(10,"陈");
        mal.remove(20);
        mal.remove("chen0");
        System.out.println(mal);
        mal.set(0,"这是0");
        System.out.println(mal.get(0));
        System.out.println(mal.size()+"  "+mal.isEmpty());
    }

}

 

你可能感兴趣的:(数据结构与算法)