🌿前言
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串……本篇文章我将用Java语言带你们实现顺序表。
👦有缘,才相遇,你好!我是hgway_hxz
❤️热爱Java,希望结识更多的小伙伴一起交流
🎉欢迎大家:👍点赞 💬评论 ⭐收藏 💖关注
✉️如果有任何问题欢迎大家在评论区讨论或者私信我
✏️行走在人生路上,总会有得失和起落
文章目录
🍀1.顺序表的概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可以分为:
- 静态顺序表:使用定长数组存储。
- 动态顺序表:使用动态开辟的数组存储。
静态顺序表适用于确定知道需要存多少数据的场景,表的定长数组导致N定大了,空间开多了浪费,开少了不够用。
相比之下动态顺序表更灵活, 根据需要动态的分配空间大小。
接下来我用Java实现一个动态顺序表。
首先在MyArraryList类中创建一个数组elem,表示数组有效数据个数的usedSize,在Test类中创建对象。
//MyArrayList.java
public class MyArrayList {
public int[] elem;//数组
public int usedSize;//数组中有效数据的个数
public MyArrayList() {
this.elem = new int[10];
}
}
//Test.java
public class Test {
public static void main(String[] args) {
MyArrayList myArrayList = new MyArrayList();
}
}
🍁2.顺序表的接口实现
🍂2.1 打印顺序表display()
把数组elem的内容遍历打印出来,但此时的usedSize值为0,调用函数的时候打印不了,还需要用add()方法。
public void display() {
for (int i = 0; i < this.usedSize; i++) {
System.out.print(this.elem[i] + " ");
}
System.out.println();
}
🍂2.2 在pos位置增加某个元素add()
1.元素在数组中没满的时候,我们需要判断pos位置合不合法
例如:因为数组没有负数下标,所以要满足pos < 0,我们最大可以在下标为4的位置增加元素,但不能在下标为5的位置增加元素,因为增加元素的时候必须保证前面一个位置有元素,所以要满足pos > usedSize。
2.元素在数组中满的时候,我们需要对数组进行扩容
例如:此时数组中元素已经满了,再增加元素会丢失,我们可以创建isFull()函数用数组的有效数据个数和数组长度比较判断满没满,用Arrays.copyOf()来扩容,别忘了要引用Java数组包import java.util.Arrays;
3.把pos位置和后面元素后移一位
例如:从数组中最后一个元素开始后移,即下标i从usedSize - 1开始,当i >= pos的时候,就执行this.elem[i + 1] = this.elem[i],然后i–直到不满足条件。然后再把要增加的元素赋值给elem[pos],最后usedSize++。
代码:
public void add(int pos, int data) {
//1.判断pos位置是否合法
if (pos < 0 || pos > usedSize) {
System.out.println(pos + "位置不合法");
return;
}
//2.判断满没满,需不需要扩容
if (ifFull()) {
this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
}
//3.pos位置和后面元素后移
for (int i = this.usedSize - 1; i >= pos; i--) {
this.elem[i+1] = this.elem[i];
}
this.elem[pos] = data;
this.usedSize++;
}
public boolean ifFull() {
return this.usedSize == this.elem.length;
}
🍂2.3 判断是否包含某个元素contains()
把数组遍历,看是否包含某个元素,包含就返回true,否则返回false。
public boolean contains(int toFind) {
for (int i = 0; i < this.usedSize; i++) {
if (this.elem[i] == toFind) {
return true;
}
}
return false;
}
🍂2.4 查找某个元素对应的位置search()
把数组遍历,寻找要查的元素对应的位置,找到就返回下标i,找不到就返回-1。
public int search(int toFind) {
for (int i = 0; i < this.usedSize; i++) {
if (this.elem[i] == toFind) {
return i;
}
}
return -1;
}
🍂2.4 获取pos位置的元素getPos()
1.判断pos位置合不合法(pos < 0 || pos >= this.usedSize)
2.判断顺序表是不是空(数组的有效数据个数等不等于0)
3.把pos位置的元素返回
代码:
public int getPos(int pos) {
//1.判断pos位置
if (pos < 0 || pos >= this.usedSize) {
System.out.println("pos位置不合法!");
return -1;
}
//2.顺序表是不是空
if (isEmpty()) {
System.out.println("顺序表为空!");
return -1;
}
//3.返回pos位置元素
return this.elem[pos];
}
public boolean isEmpty() {
return this.usedSize == 0;
}
🍂2.5 把pos位置的元素设置成某个数字setPos()
1.判断pos位置合不合法(pos < 0 || pos >= this.usedSize)
2.判断顺序表是不是空(数组的有效数据个数等不等于0)
3.把pos位置的元素设置成value
代码:
public void setPos(int pos, int value) {
//1.判断pos位置
if (pos < 0 || pos >= this.usedSize) {
System.out.println("pos位置不合法!");
return;
}
//2.判断顺序表是不是空
if (isEmpty()) {
System.out.println("顺序表为空!");
return;
}
//pos位置元素设置成value
this.elem[pos] = value;
}
🍂2.6 删除第一次出现的元素remove()
1.判断顺序表是不是空(数组的有效数据个数等不等于0)
2.判断要删除的第一次出现的元素是否存在(调用search()可以返回要删除元素的下标)
3.从要删除元素的下标开始,后一个元素向前移一位,直到最后一个下标停止,数组长度减一
代码:
public void remove(int toRemove) {
//1.顺序表是不是空
if (isEmpty()) {
System.out.println("顺序表为空");
return;
}
//2.删除的元素是否存在
int index = search(toRemove);
if (index == -1) {
System.out.println("没有你要删除的数字");
return;
}
//3.向前移一位
for (int i = index; i < this.usedSize - 1; i++) {
this.elem[i] = this.elem[i + 1];
}
this.usedSize--;
}
🍂2.7 清空顺序表clear()
直接让数组中的有效数据长度等于0
public void clear() {
this.usedSize = 0;
}
☘️3.源代码
🍃3.1 myArrayList.java
import java.util.Arrays;
/**
* Created with IntelliJ IDEA.
* Description:顺序表
* User: hxz50
* Date: 2021-11-02
* Time: 19:34
*/
public class MyArrayList {
public int[] elem;//数组
public int usedSize;//数组中的有效个数
public MyArrayList() {
this.elem = new int[10];
}
//打印顺序表
public void display() {
for (int i = 0; i < this.usedSize; i++) {
System.out.print(this.elem[i] + " ");
}
System.out.println();
}
//获取顺序表的有效长度
public int size() {
return this.usedSize;
}
//在pos位置新增元素data
public void add(int pos, int data) {
//1.判断pos位置是否合法
if (pos < 0 || pos > usedSize) {
System.out.println(pos + "位置不合法");
return;
}
//2。判断满没满,需不需要扩容
if (ifFull()) {
this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
}
//3.pos位置和后面元素后移
for (int i = this.usedSize - 1; i >= pos; i--) {
this.elem[i+1] = this.elem[i];
}
this.elem[pos] = data;
this.usedSize++;
}
public boolean ifFull() {
return this.usedSize == this.elem.length;
}
//判断是否包含某个元素
public boolean contains(int tofind) {
for (int i = 0; i < this.elem.length; i++) {
if (this.elem[i] == tofind) {
return true;
}
}
return false;
}
//查找某个元素对应的位置,找不到返回-1
public int search(int tofind) {
for (int i = 0; i < this.elem.length; i++) {
if (this.elem[i] == tofind) {
return i;
}
}
return -1;
}
//获取 pos 位置的元素
public int getPos(int pos) {
if (pos < 0 || pos >= this.usedSize) {
System.out.println(pos + " 位置元素不存在");
return -1;
}
if (isEmpty()) {
System.out.println("顺序表为空");
return -1;
}
return this.elem[pos];
}
public boolean isEmpty() {
return this.usedSize == 0;
}
//把pos位置的元素设置为value
public void setPos(int pos, int value) {
if (pos < 0 || pos >= this.usedSize) {
System.out.println("pos位置不合法");
return;
}
if (isEmpty()) {
System.out.println("顺序表为空");
return;
}
this.elem[pos] = value;
}
//删除数组的某个数字
public void remove(int toRemove) {
if (isEmpty()) {
System.out.println("顺序表为空");
return;
}
int index = search(toRemove);
if (index == -1) {
System.out.println("没有你要删除的数字");
return;
}
for (int i = index; i < this.usedSize - 1; i++) {
this.elem[i] = this.elem[i + 1];
}
this.usedSize--;
}
// 清空顺序表
public void clear() {
this.usedSize = 0;
}
}
🍃3.2 Test.java
/**
* Created with IntelliJ IDEA.
* Description:
* User: hxz50
* Date: 2021-11-02
* Time: 19:22
*/
public class Test {
public static void main(String[] args) {
MyArrayList myArrayList = new MyArrayList();
//在pos位置新增元素data
myArrayList.add(0, 1);
myArrayList.add(1, 2);
myArrayList.add(2, 3);
myArrayList.add(3, 4);
myArrayList.add(4, 5);
myArrayList.display();
System.out.println("---------------------");
//判断是否包含这个元素
System.out.println(myArrayList.contains(1));
System.out.println(myArrayList.contains(3));
System.out.println(myArrayList.contains(5));
System.out.println(myArrayList.contains(10));
System.out.println("---------------------");
//查找元素对应的位置,找不到返回-1
System.out.println(myArrayList.search(1));
System.out.println(myArrayList.search(3));
System.out.println(myArrayList.search(5));
System.out.println(myArrayList.search(10));
System.out.println("---------------------");
//获取pos位置的元素
System.out.println(myArrayList.getPos(0));
System.out.println(myArrayList.getPos(2));
System.out.println(myArrayList.getPos(4));
System.out.println(myArrayList.getPos(5));
System.out.println("---------------------");
//把pos位置的元素设置为value
myArrayList.setPos(0, 10);
myArrayList.setPos(2, 20);
myArrayList.setPos(4, 40);
myArrayList.setPos(5, 50);
myArrayList.display();
System.out.println("---------------------");
//删除数组中第一次出现的数字
myArrayList.remove(10);
myArrayList.display();
myArrayList.remove(20);
myArrayList.display();
myArrayList.remove(40);
myArrayList.display();
myArrayList.remove(99);
System.out.println("---------------------");
myArrayList.clear();
myArrayList.display();
}
}
运行结果:
1 2 3 4 5
---------------------
true
true
true
false
---------------------
0
2
4
-1
---------------------
1
3
5
pos位置不合法!
-1
---------------------
pos位置不合法!
10 2 20 4 40
---------------------
2 20 4 40
2 4 40
2 4
没有你要删除的数字
---------------------
Process finished with exit code 0