【java】数据结构---顺序表

数据结构是计算机存储数据的方式,数组,栈,二叉树,线性表等等都是数据结构,不同的数据结构有不同的优缺点,本篇博客主要说的是最简单的线性表—顺序表。
顺序表的结构如图
在这里插入图片描述由于顺序表比较简单,所以我们直接来看代码


public interface IMySquence {//定义顺序表接口
    boolean add(int pos,Object obj);//在指定位置插入元素
    Object remove(Object key);//删除指定元素
    int search(Object key);//查找元素,找到了返回下表
    boolean contain(Object key);//查找元素是否存在
    Object getPos(int pos);//获取指定下表的元素
    int size();//返回顺序表的大小
    void display();//打印顺序表
    void clear();//清空顺序表
}


import java.util.Arrays;

public class MySquence implements IMySquence {//实现顺序表接口
    private Object[]elem;
    private int usedSize;//
    private static final int DEFAULT_SIZE = 10;//默认顺序表大小
    public MySquence(){
        this.elem=new Object[DEFAULT_SIZE];
        this.usedSize=0;
    }
    public boolean isFull(){//判断顺序表是否满了
        return (usedSize==elem.length-1);
    }
    public boolean isEmpty(){//判断顺序表是否为空
        return (usedSize==0);
    }
    @Override
    public boolean add(int pos, Object obj) {
        if(pos<0||pos>usedSize){//判断指定的位置是否合法
            return false;
        }
        if(isFull()){//判断顺序表是否为满,满了扩容二倍
            this.elem=Arrays.copyOf(elem,elem.length*2);
        }
        for(int i=usedSize;i>=pos;i--){
            elem[i+1]=elem[i];//将指定位置以及后面的元素后移
        }
        elem[pos]=obj;
        usedSize++;
        return true;
    }

    @Override
    public Object remove(Object key) {
        if(isEmpty()){//判断顺序表是否为空,为空抛出异常
            throw new UnsupportedOperationException("顺序表为空");
        }
        Object object=key;//将要删除的数据保留下来
        for(int i=0;i<usedSize;i++){
            if(key.equals(elem[i])){
                for(int j=i;j<=usedSize;j++){
                    elem[j]=elem[j+1];//后面的元素前移,覆盖需要删除的元素
                }
                elem[usedSize]=null;//将最后面的元素置空
            }
        }
        usedSize--;//更新顺序表大小
        return object;
    }

    @Override
    public int search(Object key) {
        if(isEmpty()){//顺序表为空,则说明找不到
            return -1;
        }
        for(int i=0;i<usedSize;i++){
            if(key.equals(elem[i])){//找到了返回下标
                return i;
            }
        }
        return -1;
    }

    @Override
    public boolean contain(Object key) {
        if(isEmpty()){//顺序表为空,则说明不包含元素。
            return false;
        }
        for(int i=0;i<usedSize;i++){
            if(key.equals(elem[i])){//如果包含,返回true
                return true;
            }
        }
        return false;
    }

    @Override
    public Object getPos(int pos) {
        if(isEmpty()||pos<0||pos>usedSize){//指定位置的合法性
            return null;
        }
        return this.elem[pos];
    }

    @Override
    public int size() {
        return usedSize;
    }

    @Override
    public void display() {
        for(int i=0;i<usedSize;i++){
            System.out.print(this.elem[i]);
        }
        System.out.println();
    }

    @Override
    public void clear() {
        for (int i=0;i<usedSize;i++){
            this.elem[i]=null;
        }
    usedSize=0;
    }
}

测试代码

public class TestDemo {
    public static void main(String[] args) {
        MySquence mySquence=new MySquence();
        mySquence.add(0,"A");
        mySquence.add(1,"B");
        mySquence.add(2,"C");
        mySquence.add(3,"D");
        mySquence.add(3,"Hello");
        mySquence.remove("D");
        mySquence.display();
        System.out.println(mySquence.search("C"));
        System.out.println(mySquence.contain("Hello"));
        mySquence.clear();
        System.out.println(mySquence.size());
    }
}

运行结果注意,书写代码时进行增加或者删除元素时,要及时更新顺序表大小。以及在判断是否找到时候不能用==来检测。需要使用.equals方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值