顺序表
目录
概念
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表的构建
根据定义,我们可以知道顺序表是在数组的基础上进行的增删改查操作的,由此我们可以自己定义一个顺序表,基于数组对顺序表进行增删改查的操作.创建的顺序表包含数组和数组的长度。
public class SeqList {
private int[] array;//顺序表存放数据的数组
private int size;//元素个数
public SeqList() {
this.array = new int[10];//默认大小为10
}//无参数的构造方法
public SeqList(int size) {
this.array = new int[size];
}//有参数的构造方法,可以初始化顺序表长度
}
可以看到,我们创建的顺序表有两个构造方法,在实例化类的时候调用无参数的构造方法默认数组大小为10,而调用有参数的构造方法可通过传参指定数组大小,由此,一个基本的顺序表就算完成了。
顺序表功能的实现
1.尾插法
尾插法比较特殊,实现较为简单,这里我优先介绍。在开始插入之前首先应该对数组进行判满的操作,以防止出现插入元素时数组越界的操作。
//先判断数组是否满了
if(size == array.length) {
this.array = Arrays.copyOf(this.array,2*this.array.length);
}
如果链表中元素个数等于数组的长度,就是用Arrays中的copyof()函数对数组进行2倍扩容,保证元素的正常插入,之后进行尾插操作。
public void addList(int date){
//先判断数组是否满了
if(size == array.length) {
this.array = Arrays.copyOf(this.array,2*this.array.length);
}
array[size] = date;
size++;
}
将数据date插入到数组的size下标中,同时size++,表示元素个数加1。这里可以注意,也是我经常想错的一点,此处的size是元素的个数,并不是数组的长度,size表示的是顺序表存储的元素个数。在我写的代码中,初始化顺序表时,顺序表中不包含元素,size为0,在进行插入操作时,数据就插在数组的第一个位置了。
2.插入指定位置
和尾插法相同的是,首先进行判满操作,然后对插入的位置pos进行判断,如果插入的位置pos小于0,或者大于顺序表的长度,那么就可以抛出异常(代码中的异常为自定义的异常),当顺序表为空时,直接进行插入操作,顺序表不为空,将pos位置和pos后面的元素整体向后移动一格,将pos位置空出,把需要插入的元素value放入pos位置中即可。
变量i从顺序表的最后一个元素开始向后移动,下标是size-1,移动完成后将需要插入的元素value插入到pos位置中.
//自定义的异常类
public class PosException extends Exception{
public void PosEception() {
System.out.println("插入位置异常");
}
}
public void add(int pos,int value) {
//先判断数组是否满了
if(size == array.length) {
this.array = Arrays.copyOf(this.array,2*this.array.length);
}
if(pos < 0 || pos > size) {
try{
throw new PosException();
} catch (PosException e){
e.PosEception();
}
}
if(size == 0) {
array[size] = value;
size++;
}
if(pos > 0 && pos < size-1) {
for (int i = size-1; i >= pos; i--) {
array[i-1] = array[i];
}
array[pos] = value;
size++;
}
}
3.删除第一次出现的元素
1.首先对顺序表进行判空操作。
如果顺序表为空,就不需要进行删除操作,直接打印数组为空。
2.对删除位置pos进行判断。
如果pos位置不合法,直接打印元素下标错误。
3.对元素进行删除操作
利用元素的覆盖,直接用pos+1位置的元素覆盖pos位置的元素,然后将后面的元素依次向前移动。元素个数减1即可完成删除操作。
public void delete(int pos) {
//判空
if(isEmpty()) {
System.out.println("数组为空...");
} else if (pos >= size || pos < 0) {
System.out.println("元素下标错误");
} else {
for (int i = pos; i <= size-1; i++) {
array[i] = array[i+1];
}
size--;
}
}
4.修改操作
直接将指定位置的元素进行修改
public void set(int pos,int value) {
if(isEmpty()) {
System.out.println("数组为空...");
} else if (pos >= size || pos < 0) {
System.out.println("不存在此元素");
} else{
array[pos] = value;
}
}
5.获取顺序表长度
通过返回顺序表的size来获取长度
public int getSize(){
return this.size;
}
6.查找元素对应位置
创建变量i,使用for循环对数组进行遍历,找到对应元素返回下标i,没找到返回0。
//获取元素对应位置
public int indexof(int date) {
for (int i = 0; i<size;i++) {
if(array[i] == date) {
System.out.println("找到了,存在此元素位置是:"+ i);
return i;
}
}
System.out.println("没有此元素");
return 0;
}
7.清空顺序表
1.基本数据类型直接将顺序表长度置为0
2.引用数据类型要将每一个元素都置为空
public void clear() {
//将长度置为0
//普通数据类型
this.size = 0;
//引用数据类型
//将每个元素都置空
/* for (int i = 0; i < this.size; i++) {
array[i] = null;
}*/
}