线性表实现之一:数组

来源:互联网 发布:java多线程输出1到100 编辑:程序博客网 时间:2024/05/29 14:16

数组实现线性表


    线性表特征: 
    1、一个特定的线性表,应该是用来存放特定的某一个类型的元素的(元素的“同一性”);
    2、除第一个元素外,其他每一个元素有且仅有一个直接前驱;除最后一个元素外,其他每一个元素有且仅有一个直接后继(元素的“序偶性”);
    3、元素在线性表中的“下标”唯一地确定该元素在表中的相对位置(元素的“索引性”)。
    PS

    1、线性表只是数据的一种逻辑结构,其具体存储结构可以为顺序存储结构和链式储存结构来完成,对应可以得到顺序表和链表,使用内置数组可得到顺序表;使用指针可得到链表;
    2、对线性表的入表和出表顺序做一定的限定,可以得到特殊的线性表,栈(FILO)和队列(FIFO)。


    这一节介绍如何利用数组实现线性表,从而得到顺序表。

    思路
    1. 顺序表因为采用顺序存储形式,所以内部使用数组来存储数据
    2.因为存储的具体对象类型不一定,所以采用泛型操作
    3.数组操作 优点:1.通过索引快速定位到下表,查询快速
               缺点:1.数组声明时即需要确定数组大小。当操作中超过容量时,则需要重新声明数组,并且复制当前所有数据;

                     2.当需要在中间进行插入或者删除时,则需要移动大量元素(size-index个)。

    实现代码

/** * 自己用数组实现的线性表 */public class ArrayList<E> {Object[] data = null;// 用来保存此队列中内容的数组int current;// 保存当前为第几个元素的指标int capacity;// 表示数组大小的指标/** * 如果初始化时,未声明大小,则默认为10 */public ArrayList() {this(10);}/** * 初始化线性表,并且声明保存内容的数组大小 *  * @param initalSize */public ArrayList(int initalSize) {if (initalSize < 0) {throw new RuntimeException("数组大小错误:" + initalSize);} else {this.data = new Object[initalSize];this.current = 0;capacity = initalSize;}}/** * 添加元素的方法 添加前,先确认是否已经满了 *  * @param e * @return */public boolean add(E e) {ensureCapacity(current);// 确认容量this.data[current] = e;current++;return true;}/** * 确认系统当前容量是否满足需要,如果满足,则不执行操作 如果不满足,增加容量 *  * @param cur *            当前个数 */private void ensureCapacity(int cur) {if (cur == capacity) {// 如果达到容量极限,增加10的容量,复制当前数组this.capacity = this.capacity + 10;Object[] newdata = new Object[capacity];for (int i = 0; i < cur; i++) {newdata[i] = this.data[i];}this.data = newdata;}}/** * 得到指定下标的数据 *  * @param index * @return */public E get(int index) {validateIndex(index);return (E) this.data[index];}/** * 返回当前队列大小 *  * @return */public int size() {return this.current;}/** * 更改指定下标元素的数据为e *  * @param index * @param e * @return */public boolean set(int index, E e) {validateIndex(index);this.data[index] = e;return true;}/** * 验证当前下标是否合法,如果不合法,抛出运行时异常 *  * @param index *            下标 */private void validateIndex(int index) {if (index < 0 || index > current) {throw new RuntimeException("数组index错误:" + index);}}/** * 在指定下标位置处插入数据e *  * @param index *            下标 * @param e *            需要插入的数据 * @return */public boolean insert(int index, E e) {validateIndex(index);Object[] tem = new Object[capacity];// 用一个临时数组作为备份// 开始备份数组for (int i = 0; i < current; i++) {if (i < index) {tem[i] = this.data[i];} else if (i == index) {tem[i] = e;} else if (i > index) {tem[i] = this.data[i - 1];}}this.data = tem;return true;}/* * 删除指定下标出的数据 *  * @param index<br> * @return<br> */public boolean delete(int index) {validateIndex(index);Object[] tem = new Object[capacity];// 用一个临时数组作为备份// 开始备份数组for (int i = 0; i < current; i++) {if (i < index) {tem[i] = this.data[i];} else if (i == index) {tem[i] = this.data[i + 1];} else if (i > index) {tem[i] = this.data[i + 1];}}this.data = tem;return true;}}

    PS:在Java语言中,通过动态数组实现的线性表,对应着Collection接口中的子接口List接口,其数组实现可参考类ArrayList源码Vector源码

    

    

    

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 熬了一夜睡不着怎么办 有人看我脚走路怎么办 穿牛仔裤裆部有三角怎么办 我的电脑打cffps不稳定怎么办 生米煮成了熟饭该怎么办 做完下蹲腿疼该怎么办 下蹲腿的筋酸痛怎么办 躺平了 腿酸痛怎么办 500上下蹲后腿痛怎么办 蹲完马步后站不起来怎么办? 车在水里熄火了怎么办 脚磕到了很疼怎么办 破腹产4年了腰疼怎么办 蹲起之后腿疼怎么办 深蹲起跳伤腰部怎么办 蹲起膝盖有响声怎么办 腰突然不能弯了怎么办 蚂蚱吃了会过敏怎么办 孕妇能吃蚂蚱菜怎么办 孕妇吃了蚂蚁菜怎么办 白果很硬的时候怎么办 有痔疮吃了胡椒怎么办 吃紫菜多了难受怎么办 四川泡菜太酸了怎么办 孕妇吃了白花菜怎么办 怀孕吃了马扎菜怎么办 被铁钉扎伤了脚怎么办 风扇吹得肩膀疼怎么办 胳膊肌肉那块肿了怎么办 生完孩子臀部变宽怎么办 3岁宝宝肋骨外翻怎么办 胸肌正面不明显侧面看才有怎么办 小孩胸肌骨突出外翻怎么办 衣柜隔层板坏了怎么办 科三路线记不住怎么办 喂奶以后胸变小了怎么办 健身完肩膀缝疼怎么办 生过孩子胯部宽怎么办 无肩带文胸往下滑怎么办 内衣肩带老是往下滑怎么办 乳房发育一边大一边小怎么办