Java实现顺序表
目录
一、顺序表的简单理解
顺序表示用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般以数组为基础进行存储。
1、为什么我们要以数组为基础来构建顺序表呢?
首先,我们的数组是在内存中的顺序存储,因此他就可以更好的在逻辑上实现顺序表。
并且,数组里面存储的元素就像一个队伍一样,每个人都是紧密连接,既不能打乱队伍顺序,也不能跳过一个空位,去排下一个位置,并且每个人都有自己对应的编码,也就是他们的下标。

这就是一个数组,因此由于有以上的优势,他完全可以胜任顺序表的地基。
2、顺序表都具有哪些功能
首先顺序表会有增,删,查,找这四个功能,接下来我们将会用java代码的形式来对这些功能的实现并且构建一个顺序表。
二、顺序表的代码实现
1、构建并且初始化顺序表
首先我们需要构建一个顺序表,前文指出顺序表的地基为数组,因此我们需要一个数组,但是仅仅有一个数组是不够的,因为我们只知道数组的长度,并不知道其实数组里面存储了多少的元素,所以我们还需要一个东西来记录我们顺序表存储了多少的元素个数。
public class myArraysList {
public int[]arrary;
public int usedSize ;
// 获取顺序表的有效数据长度
public myArraysList(){
this.arrary = new int[10];//初始化数组
}
}
这里我定义了一个构造方法,目的是用来在方法内部定义数组大小,开辟空间。
2、在顺序表中添加元素
在添加元素时,我们需要考虑两点问题
1、判断需要添加元素的下标是否在顺序表的范围内
判断添加元素下标是否大于零,并且是否在顺序表存储元素数量范围内
2、如果添加元素下标合法,进行添加元素操作。
关于这一条我们会有两种情况
1、尾部插入
这种插入最为简单,直接插入到顺序表最后面就可以

2、中间插入
这个就稍微有点复杂了,首先我们得吧数组插入元素的位置空出来,因此我们需要把插入位置元素的位置以及后面元素统一向后移动一位,这样就腾出位置,然后插入元素

3、判断顺序表是否满了满了的话我们需要进行扩容
对于判断顺序表是否满了,我构建了一个布尔类型的返回方法,因此可以更好的在判断语句中利用它。对于扩容我们可以利用copyOf这个方法来实现对数组的扩容
4、实现代码如下:
public boolean isFull() {
return this.arrary.length == this.usedSize;
}
public void add(int pos,int date){
if(pos <0||pos >this.usedSize){//判断是否在顺序表范围内
System.out.println("pos不合法");
return;
}
if(isFull()){
//判断是否满了,满了的话扩容
this.arrary = Arrays.copyOf(this.arrary,this.usedSize*2);
}
for(int i = this.usedSize - 1; i > pos; i--){
this.arrary[i+1] = this.arrary[i];//从后往前落动
}
this.arrary[pos] = date;
this.usedSize++;
}
3、打印顺序表中的元素
打印顺序表中元素较为简单,因为我们已经知道了顺序表存储元素个数,因此for循环正常进行打印数组就可以
public void display(){
for (int i = 0; i < this.usedSize; i++){
System.out.print(this.arrary[i]+" ");
}
System.out.println();
}
4、判断顺序表中是否含有某个元素
这个直接遍历整个顺序表来查找元素即可,返回类型为布尔
判定是否包含某个元素
public boolean contains(int toFind) {
for(int i = 0; i < this.usedSize ; i++){
if(toFind == this.arrary[i]){
return true;
}
}
return false;
}
5、查找顺序表中元素的下标
这个直接遍历整个顺序表来查找元素,并且返回下标值就可以,当找不到的时候我们返回-1
// 查找某个元素对应的位置,找不到返回-1
public int search(int toFind){
for (int i = 0; i < this.usedSize; i++){
if(toFind == this.arrary[i]){
return i;
}
}
return -1;
}
6、更新顺序表对应下标的元素值
关于这个我们得判断两点:
1、判断对应下标是否越界或者不存在
2、判断顺序表是否为空
判断顺序表是否为空我构建了一个返回值为布尔类型的方法
// 给 pos 位置的元素设为/更新 value
public void setPos(int pos, int value){
if(pos < 0||pos > this.usedSize){
System.out.println("pos下标越界");
return;
}
if(ifEmp()){
System.out.println("顺序表为空");
return;
}
this.arrary[pos] = value;
}
7、查找顺序表对应下标的元素值
这个也是老样子,先判断下标是否越界或者不存在,然后遍历返回值就可以了
// 获取 pos 位置的元素
//判断是否越界
//判断是否顺序表为空
//直接返回下标元素
public int getPos(int pos){
if(pos < 0||pos > this.usedSize){
System.out.println("pos下标越界");
return -1;
}
if(ifEmp()){
System.out.println("顺序表为空");
return -1;
}
return this.arrary[pos];
}
8、删除顺序表中的元素
删除元素其实和增加元素相反,如果删除元素在最后,直接删除即可但是如果删除元素在中间,其后面元素都要向前挪动一位

代码如下:
//删除第一次出现的关键字key
public void remove(int toRemove){
if(ifEmp()){
System.out.println("顺序表为空");
return;
}
if(-1 == search(toRemove)){
System.out.println("不存在");
return;
}
for(int i = search(toRemove); i < this.usedSize - 1; i++){
this.arrary[i] = this.arrary[i+1];//左移
}
this.usedSize--;
}
9、获取顺序表的长度
public int size() {
return this.usedSize;
}
返回代表有效长度 的值 usedSize 。
10、清空顺序表
public void clear(){
this.usedSize = 0;
}
通过将 有效长度置为 0 来清空数组。
三、顺序表的缺点和优点总结
1、顺序表的优点
顺序表的的优势体现在查找方面,只要给出对应的下标,则可以快速查找时间复杂度为O(1)。
2、顺序表的缺点
顺序表的缺点其实也很显而易见,他的缺点主要在于删除和增加,因为每个元素紧密相连,所以在删除和增加时不得不全部来移动整个数组,因此时间复杂度为O(n)。
这就是我们的顺序表的简单实现,我是小夏,我们下期链表再见!