Java数据结构-线性表之顺序表ArrayList
线性表的顺序存储结构。也称为顺序表。指用一段连续的存储单元依次存储线性表中的数据元素。
依据顺序表的特性,我们用数组来实现顺序表,以下是我通过数组实现的Java版本号的顺序表。
package com.phn.datestructure;
/**
* @author 潘海南
* @Email 1016593477@qq.com
* @TODO 顺序表
* @date 2015年7月16日
*/
public class FOArrayList<E> {
// 顺序表长度
private int size;
// 顺序表默认数组为null
private Object[] data = null;
// 顺序表中数组的初始化长度
private int capacity;
// 顺序表默认初始化长度
private static final int DEFUALT_INITIAL_SIZE = 0;
/**
* 默认无參构造函数
*/
public FOArrayList() {
this(DEFUALT_INITIAL_SIZE);
}
/**
* @TODO 带參构造函数
* @param initialSize 初始化顺序表长度
*/
public FOArrayList(int initialSize) {
if (initialSize < 0) {
throw new RuntimeException("数组大小错误:" + initialSize);
}
this.data = new Object[initialSize];
this.capacity = initialSize;
this.setSize();
}
/**
* @TODO 设置顺序表的长度
*/
private void setSize() {
this.size = 0;
}
/**
* @TODO 获取顺序表的长度
* @return size 顺序表的长度
*/
public int size() {
return this.size;
}
/**
* @TODO 顺序表加入元素
* @param e 数据元素类型
* @return true
*/
public boolean add(E e) {
ensureSize(size);
this.data[size] = e;
this.size++;
return true;
}
/**
* @TODO 顺序表插入元素
* @param index 插入位置
* @param e 数据元素类型
* @return true
*/
public boolean insert(int index, E e) {
if (index >= 0 && index <= size) {
ensureSize(size);
E temp = (E) this.data[index - 1];
this.data[index - 1] = e;
this.size++;
for (int i = index; i <= size; i++) {
E temp2 = (E) this.data[i];
this.data[i] = temp;
temp = temp2;
}
} else {
throw new RuntimeException("数组下标错误:" + index);
}
return true;
}
/**
* @TODO 顺序表删除元素
* @param index 将要删除的元素的索引位置
* @return E 删除的元素
*/
public E remove(int index) {
validateIndex(index);
E e = (E) this.data[index];
for (int i = index; i < size - 1; i++) {
this.data[i] = this.data[i + 1];
}
this.size--;
return e;
}
/**
* @TODO 依据元素索引位置获取元素
* @param index 元素的索引位置
* @return E 元素e
*/
public E get(int index) {
validateIndex(index);
return (E) this.data[index];
}
/**
* @TODO 将顺序表中索引位置为i的元素改动为元素e
* @param index 元素的索引位置
* @param e 须要改动成的元素
* @return true 改动成功标志
*/
public boolean set(int index, E e) {
validateIndex(index);
this.data[index] = e;
return true;
}
@Override
public String toString() {
return this.arrayToString(data);
}
/**
* @TODO 获取字符串形式的顺序表中的数组序列
* @param a 顺序表中的数组
* @return String 字符串形式的顺序表中的数组序列
*/
private String arrayToString(Object[] a) {
if (a == null)
return "null";
int iMax = this.size - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0;; i++) {
b.append(String.valueOf(a[i]));
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
/**
* @TODO 验证所给索引位置是否合法
* @param index 给出的索引位置
*/
private void validateIndex(int index) {
if (index >= this.size || index <= 0) {
throw new RuntimeException("数组下标错误:" + index);
}
}
/**
* @TODO 推断是否须要扩充顺序表容量
* @param currentSize 当前顺序表的大小
*/
private void ensureSize(int currentSize) {
if (currentSize == capacity) {
this.capacity = (this.capacity * 3) / 2 + 1;
Object[] newData = new Object[this.capacity];
for (int i = 0; i < currentSize; i++) {
newData[i] = this.data[i];
}
this.data = newData;
}
}
}
主要注意上述3个私有成员变量。例如以下:
// 顺序表长度
private int size;
// 顺序表中数组的初始化长度
private int capacity;
// 顺序表默认数组为null
private Object[] data = null;
如同凝视解释的那样,size用来表示顺序表的长度。data用来表示数组,而capacity用来表示数组的长度.
相信data应该比較好理解,而相应的两个长度变量相对难理解一些,以下解释一下:
- size指的是对外界訪问这个顺序表的长度时展示的值,是顺序表中数据元素的个数,随顺序表插入和删除操作而会进行改变;
- capacity表示的是data数组的长度,实际上也是整个顺序表的容量。在顺序表初始化的时候能够赋值。或者之后能够调用顺序表的扩容来进行改变;
- size是小于等于capacity的。
这里主要讲讲顺序表的插入和删除:
顺序表的插入演示如图所看到的:
依据图片能够看出插入一个元素后,插入位置之后的元素都须要向后移动一个位置。
删除操作则是插入操作的逆过程,删除位置之后的元素都须要向前移动一个位置。
时间复杂度分析:
- 在顺序表进行存入,查找和改动时,平均时间复杂度都是O(1);
- 而在进行插入和删除操作时。最快时为O(1),最慢时为O(n),所以平均时间复杂度为O(n)。
解释:上述的存入和插入有差别,存入表示存储在数组末尾,而插入表示插入在任何位置。
优缺点分析:
长处:
- 不用为表示表中数据元素之间的逻辑关系而添加额外的存储空间;
能够高速的存取表中任何位置的元素。
缺点:插入和删除操作须要移动大量元素;
- 当线性表的长度变化较大的时候,非常难确定存储空间的容量;
- easy造成存储空间的“碎片”。
Java数据结构-线性表之顺序表ArrayList的更多相关文章
- 数据结构Java实现02----线性表与顺序表
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 数据结构Java实现01----线性表与顺序表
一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有 ...
- [C++]数据结构:线性表之顺序表
1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...
- [数据结构 - 第3章] 线性表之顺序表(C++实现)
一.类定义 顺序表类的定义如下: #ifndef SEQLIST_H #define SEQLIST_H typedef int ElemType; /* "ElemType类型根据实际情况 ...
- C#线性表之顺序表
线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...
- [C++]线性链表之顺序表<一>
顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 ...
- c/c++ 线性表之顺序表
线性表之顺序表 存储在连续的内存空间,和数组一样. 下面的代码,最开始定义了一个能存8个元素的顺序表,当超过8个元素的时候,会再追加开辟空间(函数:reInit). 实现了以下功能: 函数 功能描述 ...
- [C++]线性链表之顺序表<二>
/* @content 线性链表之顺序表 @date 2017-3-21 1:06 @author Johnny Zen */ /* 线性表 顺序表 链式表[带头指针/不 ...
- python基础下的数据结构与算法之顺序表
一.什么是顺序表: 线性表的两种基本的实现模型: 1.将表中元素顺序地存放在一大块连续的存储区里,这样实现的表称为顺序表(或连续表).在这种实现中,元素间的顺序关系由它们的存储顺序自然表示. 2.将表 ...
- 线性表之顺序表C++实现
线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件 #include<iostream> ; //定义顺序表SeqList的模板类 template<class ...
随机推荐
- [置顶]
kubernetes资源对象--ConfigMap
原理 很多生产环境中的应用程序配置较为复杂,可能需要多个config文件.命令行参数和环境变量的组合.使用容器部署时,把配置应该从应用程序镜像中解耦出来,以保证镜像的可移植性.尽管Secret允许类似 ...
- hdu 1162 Eddy's picture (Kruskal算法,prim算法,最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 [题目大意] 给你n个点的坐标,让你找到联通n个点的一种方法.保证联通的线路最短,典型的最小生成 ...
- window coordinate
到ndc的转换是通过(x/w,y/w,z/w) 到了 window coordinates dx upper left gl lower left setviewport setscissor rt ...
- ElasticSearch测试数据
curl命令数据 curl -XPUT http://127.0.0.1:9200/us/user/1 -d "{\"email\":\"john@smith. ...
- 简谈WP,IOS,Android智能手机OS
什么是智能手机? 相信到现在这个已经是傻瓜到不能再傻瓜的问题了 智能手机都不懂? 那你活着还有什么意思= = 但是为了谈论今天的三大主角:wp,ios,android 不得不回答一下这个笨笨的问题 如 ...
- 一个对比各种开源库的网站 libhunt
https://www.libhunt.com/ https://github.com/LibHunt/awesome-javascript
- ubuntu用su切换,输入密码提示认证失败解决办法
ubuntu用su切换,输入密码提示认证失败,经查阅原来Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许 su 到 root ,对于桌面用户来说这个可能是为了增强安全性. 终端下 ...
- Excel如何取消显示分页虚线
点击普通模式,保存文件,关闭文件再打开就好了. 文章来源:刘俊涛的博客 地址:http://www.cnblogs.com/lovebing 欢迎关注,有问题一起学习欢迎留言.评论.
- 基于SpringMVC+Ext.js的权限管理系统(无权限框架)
代码地址如下:http://www.demodashi.com/demo/12811.html 0.准备工作 注意!!! 本案例数据库相关请下载例子包,内有数据库脚本.EXCEL数据表和详细的设计文档 ...
- java如何实现多个线程并发运行
随着计算机技术的发展,编程模型也越来越复杂多样化.但多线程编程模型是目前计算机系统架构的最终模型.随着CPU主频的不断攀升,X86架构的硬件已经成为瓶,在这种架构的CPU主频最高为4G.事实上目前3. ...