这是个人写的第一篇博客,有些言语不顺的地方,请见谅,有讲的不对的地方,请指点下。
=====================================================================================================
在讲顺序表之前要说线性表,线性表包含很多,顺序表,链表,队列,栈等都属于线性表。
线性表的定义如下:线性表(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的使用频率完全不低于数组,想了想,想法就这些。