数据结构——顺序表

来源:互联网 发布:固态硬盘测试软件 编辑:程序博客网 时间:2024/05/21 05:36

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

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

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

线性表的定义如下:线性表(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的使用频率完全不低于数组,想了想,想法就这些。


原创粉丝点击