线性表的顺序存储结构————顺序表(java)
嗨!收到一张超级美丽的风景图,愿你每天都能顺心!
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/64944b15e20e479a99e5e3fc0402156d.jpeg#pic_center)
顺序表
线性表的顺序存储结构是把线性表中的所有元素按照其逻辑顺序依次存储到从计算机存储器中指定存储位置开始的一块连续的存储空间。由于线性表中逻辑上相邻的两个元素在对应的顺序表中它们的存储位置也相邻,所以这种映射方式称为直接映射。线性表的顺序存储结构简称顺序表
这样线性表L中第一个元素的存储位置就是指定的存储位置,第i+1个元素(1<=i<=n-1)的存储位置紧接在第i个元素的存储位置的后面。假设线性表的元素类型为T,则每个元素所占用的存储空间的大小(即字节数)为sizeof(T),整个线性表所占用存储空间的大小为n*sizeof(T),其中n为线性表的长度。
在Java语言中,我们可以借用数组和列表两种元素类型来实现顺序表。
数组实现顺序表结构的创建:
public class SqList {
private int []data;
private int size;
public SqList(int max){
data = new int[max];
size = 0;
}
- private int[] data;: 这是一个私有整型数组,用于存储顺序线性表中的元素。
- private int size;: 这是一个私有的整形变量,用于跟踪线性表当前已经元素数量。
- public SqList(int max){…}: 这是一个SqList的构造方法,接受一个参数max,表示顺序表的最大容量。在构造函数内部,它初始化了data数组并分配了指定容量的空间,同时将size设置为0,表示初始时线性表中没有元素。
列表实现顺序表结构的创建:
import java.util.ArrayList;
public class SqList {
private ArrayList<Integer> data;
public SqList(){
data = new ArrayList<>();
}
- import java.util.ArrayList: 这行代码导入了Java库中的ArrayList类,它与数组不同的是,它可以自动调节大小以容纳更多的元素。
- private ArrayList< Integer > data;: 这是一个私有成员变量,类型为ArrayList< Integer >,用于存储整数序列。
- public SqList() { … }: 这是SeqList类的构造函数。当创建一个新的SeqList对象时,这个构造函数会被调用。在这个构造函数中,我们初始化data变量为一个新的ArrayList< Integer >实例。
顺序表基本运算的实现
插入数据元素:
由于上面我们已经创建了空的顺序表,那么现在要开始增加数据元素。
- 如果顺序表是满的,那么这个时候就不能插入。
- 接下来找到插入元素的索引位置,并将该位置及其之后的所有元素向后移动一位,最后在将新元素插入到正确位置(这里采用尾插法,先定了一个私有的方法寻找插入位置的索引值),并增加size的值。
思路有了,接下来看两种方法的代码:
数组实现:
private int findInsertIndex(int e){
for(int i = 0;i < size;i++){
if(data[i] >= e){
return i;
}
}
return size;
}
public void add(int e){
if(size == data.length){
throw new RuntimeException("顺序表已满");
}
int index = findInsertIndex(e);
for(int i = size;i > index; i--){
data[i] = data[i-1];
}
data[index] = e;
size++;
}
列表实现:
private int findInsertIndex(int e){
for(int i = 0;i < data.size();i++){
if(data.get(i) >= e){
return i;
}
}
return data.size();
}
public void add(int e){
int index = findInsertIndex(e);
data.add(index,e);
}
注:由于这里我们用的是ArrayList< E >这个类,所以我们可以查看我们的API找到我们想要实现的方法
(对应的是列表的长度)
(对应要插入的索引位置)
(对应插入元素的索引位置和元素)
由于我们的ArrayList类是可伸缩的,所以不用判断是否满了抛出异常。
删除数据元素:
- 找到删除数据的索引值
- 将此元素后的所有元素向前移动一个单位
- 如果顺序表是个空表或者要删除的索引位置大于表的长度那么就会抛出异常。
数组实现:
public void remove(int index){
if(index < 0 || index >= size){
throw new RuntimeException("索引越界");
}
for(int i = index + 1;i < size;i++){
data[i-1] = data[i];
}
size--;
}
列表实现:
public void remove(int index){
data.remove(index);
}
用于删除指定索引的元素
查找数据元素的索引
数组实现:
public int find(int e){
for(int index = 0;index < data.length;index++){
if(data[index] == e){
return index;
}
}
return -1;
}
public void findIndex(int e){
int index = find(e);
System.out.println(index);
}
列表实现:
public int indexOf(int e){
return data.indexOf(e);
}
public void findIndex(int e){
int index = indexOf(e);
System.out.println(index);
}
用于查找指定元素的索引
输出顺序表以及展示效果
数组实现
public void print(){
for(int i = 0;i < size;i++){
System.out.print(data[i]+" ");
}
System.out.println();
}
最后我们在主函数调用我们的方法即可
public static void main(String[] args) {
SqList sqList = new SqList(5);
sqList.add(1);
sqList.add(2);
sqList.add(3);
sqList.add(4);
sqList.add(5);
sqList.print();
sqList.remove(1);
sqList.print();
sqList.findIndex(3);
}
列表实现
public static void main(String[] args) {
SqList sqList = new SqList();
sqList.add(1);
sqList.add(2);
sqList.add(3);
sqList.add(4);
sqList.add(5);
sqList.print();
sqList.remove(2);
sqList.print();
sqList.findIndex(5);
}
结语
本次分享就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区留言,如果给小伙伴们带来了一些收获,请留下你的小赞,你的点赞和关注将会成为博主分享每日学习的动力。