目录
顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删改查。
顺序表一般可以分为:
- 静态顺序表:使用定长数组存储。
- 动态顺序表:使用动态开辟的数组存储。
静态顺序表适用于确定直到需要存多少数据的场景。我们这次实现的是静态顺序表。
这就是一个静态顺序表,它的特点是(1)空间是连续的(2)通过下标访问,所以可以随机访问(3)可能出现浪费空间的情况
创建一个顺序表
(1)定义两个类,分别是Test.class和MyArrayList.class,后者就是要创建的顺序表。
(2)在MyArrayList.class中定义两个成员属性,elem是顺序表使用的数组,usedSize用来记录数组中的成员数量。
(3)书写构造方法,引用一个大小为10的数组。
(4)在Text.class中new一个对象,命名为myArrayList。
public class MyArrayList {
public int[] elem;
public int usedSize;
//构造方法
public MyArrayList() {
this.elem = new int[10];
}
}
public class Test {
public static void main(String[] args) {
MyArrayList myArrayList = new MyArrayList();
}
}
注意一下:这个时候顺序表已经创建好了,但是里面还没有内容,usedSize是初始值为0,elem是初始值为null。
在指定的pos位置增加指定元素
(1)在顺序表中书写add方法,定义两个参数pos(数组下标)和data(存放的数字)。
(2)判断pos是否为负数,判断pos是不是合理的位置(必须按顺序增加,不能越位)。
(3)判断当前数组有没有满,如果满的话就对数组进行扩容。
(4)如果不是在最后一位存放,则要将pos后的数统统向后移动一位,然后再存放pos位置的数字。
(5)赋值完成后要对usedSize++。
public void add(int pos,int data) {
if(pos < 0 || pos > this.usedSize) {
System.out.println("位置错误,无法添加!");
return;
}
if(isFull()) {
this.elem = Arrays.copyOf(this.elem,this.elem.length*2);
System.out.println("扩容成功!");
}
for(int i = this.usedSize - 1;i >= pos;i--) {
this.elem[i+1] = this.elem[i];
}
this.elem[pos] = data;
this.usedSize++;
System.out.println("添加成功!");
}
注意一下:所有的成员方法写在MyArrayList类中,这些功能属于顺序表。扩容直接调用Arrays.copyOf方法。添加完成后可以在Test类中通过对象来调用一下。
打印顺序表
定义display方法,遍历数组然后打印,i的最大值是usedSize-1。
public void display() {
for(int i = 0;i < this.usedSize;i++) {
System.out.print(this.elem[i]+" ");
}
System.out.println();
}
获取顺序表有效数据长度
直接返回usedSize,它一直记录着数组中的有效数字个数。
public int size() {
return this.usedSize;
}
判断数组是否满了
(1)定义返回类型为boolean的方法,如果满了返回true,否则返回false。
(2)返回 usedSize 是否等于 elem.length(数组长度)。
public boolean isFull() {
return this.usedSize == this.elem.length;
}
判断是否包含某个元素
(1)定义返回类型为boolean的方法,参数toFind是你要找的数字。
(2)遍历数组每个数与toFind比较,如果相等返回true,找不到则返回false。
public boolean contains(int toFind) {
for(int i = 0;i < this.usedSize;i++) {
if(this.elem[i] == toFind) {
return true;
}
}
return false;
}
查找某个元素对应的位置
(1)定义返回类型为int的方法,参数toFind是你要找的数字。
(2)遍历数组每个数与toFind比较,如果相等返回下标,找不到则返回-1。
public int search(int toFind) {
for(int i = 0;i < this.usedSize;i++) {
if(this.elem[i] == toFind) {
return i;
}
}
System.out.println("查找元素不存在!");
return -1;
}
获取pos位置的元素
(1)判断pos是否为负数,判断pos位置有没有元素,不符合的话返回-1。
(2)返回pos位置的元素。
public int getPos(int pos) {
if(pos < 0 || pos >= this.usedSize) {
System.out.println("位置错误,无法查找!");
return -1;
}
return this.elem[pos];
}
给pos位置设置为value
(1)定义方法,传参pos(位置)和value(要改变的值)。
(2)判断pos是否为负数,判断pos位置有没有元素,不符合的话返回。
(3)将value赋给pos位置的元素。
public void setPos(int pos,int value) {
if(pos < 0 || pos >= this.usedSize) {
System.out.println("位置错误,无法修改!");
return;
}
this.elem[pos] = value;
System.out.println("修改成功!");
}
注意一下:这里的return作用是退出方法,不需要返回值。
删除第一次出现的关键字key
(1)判断数组是否为空,如果为空则返回-1。
(2)调用search方法(查找某个元素对应的位置),用index接受返回值,如果返回值为-1代表key没有出现,直接退出。
(3)如果key在数组中存在,返回下标赋给index。
(4)遍历index后的数组元素,将index后的第 i+1 位赋给第 i 位,这样第index位的元素就被删除了。
(5)删除成功后要对usedSize--。
public void remove(int key) {
if(this.usedSize == 0) {
System.out.println("顺序表为空,无法删除!");
return;
}
int index = search(key);
if(index == -1) {
System.out.println("指定数字不存在,无法删除!");
return;
}
for(int i = index;i < this.usedSize;i++) {
this.elem[i] = this.elem[i+1];
}
this.usedSize--;
System.out.println("删除成功!");
}
注意一下:在遍历时 i 要小于 usedSize - 1,不然最后一位 i + 1 就会越界。
清空顺序表
直接将usedSize赋值为0。
public void clear() {
this.usedSize = 0;
System.out.println("清理成功!");
}
做到这里顺序表的全部功能就已经实现完成了,如果有任何的错误漏洞或者可以优化的地方希望大家多多批评指正,欢迎在评论区留言~