数据结构——顺序表

这是个人写的第一篇博客,有些言语不顺的地方,请见谅,有讲的不对的地方,请指点下。

=====================================================================================================

在讲顺序表之前要说线性表,线性表包含很多,顺序表,链表,队列,栈等都属于线性表。

线性表的定义如下:线性表(linear list) 是n个类型相同的数据元素的有限序列。首先:线性表存储的都是同一类型的的元素,例如:int,char等数据类型,也可以student类型;其次:是有限的,我的理解是线性表的容量受限于硬件条件,即使线性表可以根据元素的多少进行自由扩容,但数据的最终还是写入硬件中。然后是序列:百度上解释“在数学上,序列是被排成一列的对象(或事件);这样每个元素不是在其他元素之前,就是在其他元素之后。这里,元素之间的顺序非常重要”这个解释已经是表现出线性表线性的特点,线性表之间存在着序偶关系,除了表头只有直接后驱,表尾只有直接前驱,其他元素都同时存在直接前驱与直接后驱。线性表到此为止。

顺序表:是线性表中的一种子类型,用Java的话来说,说顺序表继承/实现了线性表。同时顾名知意,顺序表是用一组地址连续的存储单元存储的,我的理解是像数组,同时我也是用数组来实现顺序表的;

顺序表的实现:

      第一:顺序表是数据的容器,所以必须有数据的增删改查;所以写

    public interface ArrayList<T> {
        
        
        /**
         * 清空顺序表
         * @return 返回一个空的数组
         */
        T[] enptyList();
        /**
         * 往顺序表中添加数据
         */
        void add(T t);
        
        /**
         * 在顺序表中第i个元素后插入一个元素
         * @return  加入成功返回加入元素后的以数组返回顺序表内的元素
         */
        T[] insertData(int i,T t);
        /**
         * 从顺序表中删除第i个元素
         * @return  删除后返回被删除元素
         */
        T deleteData(int i);
        /**
         * 查询顺序表内所有数据,以集合存储
         * @return 返回以数组返回顺序表内的元素
         */
        T[] selectAll();
        /**
         * 根据下标找元素
         * @return 一个元素
         */
        T selectData(int i);
        /**
         * 根据元素找到元素的位置
         * @return int 
         */
        int selectIndex(T t);
        /**
         * 根据下标将该元素替换为参数元素
         * @return 返回被替换元素
         */
        T replaceData(int i,T t);
        /**
         * 顺序表的实际长度
         * @return int
         */
        int lenthList();
    }

 第二:就是实现接口了:
public class ArrayListImpl implements ArrayList<Integer> {
    private Integer[] data = null;
    private int size;
    private int length = 0;
    private ArrayListImpl() {
    }

    /**
     * 通过构造函数创建数组来存储顺序表的数据
     * 
     * @param size
     */
    public ArrayListImpl(int size) {
        this.size = size;
        this.data = new Integer[this.size];
    }

    @Override
    public Integer[] enptyList() {
        this.data = null; // 直接将数组置换为null;第一次是下,理论上应该可以
        return this.data;
    }

    @Override
    public void add(Integer obj) {
        if(this.length<this.size){
            this.data[this.length] = obj; // 顺序表的初始长度为0;当加入一个元素是长度+1
            this.length++;
        }else{
            System.out.println("表已满");
        }
        
    }

    @Override
    public Integer[] insertData(int i,Integer obj) {
       if(this.length<this.size){
           int j = this.length;
           while(j>i){
               this.data[j] = this.data[j-1];
               j--;
           }
           this.data [i] = obj;
           this.length ++;
       }else{
           System.out.println("表已满");
       }
        
        return this.data;
    }

    @Override
    public Integer deleteData(int i) {
        Integer obj = null ;

        if(this.length != 0){
            if(0 <= i && i<this.length-1){
                obj = this.data[i];
                for ( ; i < data.length-1; i++ ) {
                    this.data[i] = this.data[i+1];
                }
                this.data[this.length-1] = null;
                this.length--;
            }else {
                System.out.println("该元素不在范围内");
            }
        } else {
            System.out.println("顺序表为空");
        }
        return obj;
    }

    @Override
    public Integer[] selectAll() {
        // TODO Auto-generated method stub
        return this.data;
    }

    @Override
    public Integer selectData(int i) {
        // TODO Auto-generated method stub
        
        return this.data[i];
    }

    @Override
    public int selectIndex(Integer obj) {
        for(int i=0;i<this.length;i++){
            if(this.data[i] == obj){
                return i;
            }
        }
        return -1;
    }

    @Override
    public Integer replaceData(int i,Integer obj) {
        Integer rep ;
        if(this.length != 0){
            if(0 <= i && i<this.length-1){
                rep = this.data[i];
                this.data[i] = obj;
                return rep;
            }else {
                System.out.println("该元素不在范围内");
            }
        } else {
            System.out.println("顺序表为空");
        }
        return null;
    }

    @Override
    public int lenthList() {
        // TODO Auto-generated method stub
        return this.length;
    }

}

顺序表实现后感想:做了个东西总会有些想法,首先就是整个顺序表都是用数组来实现的,而且没有复杂的逻辑,为什么要费这功夫;这就会想到jdk的ArrayList,不能说这个顺序表是实现了ArrayLIst,起码我认为ArrayList的本质上就是一个顺序表,只不过功能更加齐全,代码结构更优秀的一个实现,在平时的使用中ArrayList的使用频率完全不低于数组,想了想,想法就这些。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值