顺序表
一.顺序表
1.什么是顺序表?
- 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数
据的增删查改 - 顺序表一般可以分为:
- 静态顺序表:使用定长数组存储。
- 动态顺序表:使用动态开辟的数组存储
2.顺序表的用途
- 顺序表解决了数组不能改变大小这个限制,我们多知道定义了一个数组就不能再改变数组的大小了,这是因为我们申请数组的内存空间是一片连续内存,这个内存是不可变的,也许有小伙伴会问能不能再原有的数组上再拼接一个数组,很抱歉是不可以滴。顺序表就解决了这个问题,应该顺序表可以扩容,接下来我们共同完成一个顺序表。
二.用代码实现一个顺序表
0.模板:
-
//这些就是我们要实现的函数 // 打印顺序表 public void display() { } // 在 pos 位置新增元素 public void add(int pos, int data) { } // 判定是否包含某个元素 public boolean contains(int toFind) { return true; } // 查找某个元素对应的位置 public int search(int toFind) { return -1; } // 获取 pos 位置的元素 public int getPos(int pos) { return -1; } // 给 pos 位置的元素设为 value public void setPos(int pos, int value) { } //删除第一次出现的关键字key public void remove(int toRemove) { } // 获取顺序表长度 public int size() { return 0; } // 清空顺序表 public void clear() { }
1.打印顺序表
-
这里是通过一个for循环来实现打印顺序表的,需要注意的是打印结束条件并不是elem.length而是this.usedSize(有效数据大小),这里只要打印有效元素就行了,不是要遍历整个数组。
- 打印顺序表 方法1
public void display() { for (int i = 0; i < this.usedSize; i++) { System.out.print(elem[i]);//打印 } System.out.println();//打完换行 }
-
方法2:类似toSting打印数组 [1,2,3,]
public void display() { System.out.print("["); for (int i = 0; i < this.usedSize; i++) { if (i!=0) {System.out.print(",");} System.out.print(elem[i]);//打印 } System.out.print("]"); System.out.println(); }
2.获取顺序表的长度(有效数据)
-
只要把usedSize的值返回就行
public int size() { return this.usedSize; }
3.添加元素
-
在每个元素后面添加元素
-
在每个元素的后面添加完元素,每次添加后把usedSize+1
-
方法一:
public void add(int data){ elem[usedSize++]=data; } //运行结果:[11,22,33]
-
方法2:直接调用add(int pos, int data)
//方法二直接调用add(int pos, int data) public void add(int data){ add(usedSize,data); } //添加三个元素 myArrayList.add(11); myArrayList.add(22); myArrayList.add(33); //运行结果:[11,22,33]
-
-
在表的任意位置添加元素
-
思维图
-
代码实现
// 在 pos 位置新增元素 public void add(int pos, int data) { if(pos<0||pos>this.usedSize){ System.out.println("pos 位置不合法!"); } if(isFull()){ this.elem= Arrays.copyOf(this.elem,this.elem.length*2);//扩容 } for (int i = usedSize-1; i >=pos ; i--) { elem[i+1]=elem[i]; } elem[pos]=data; usedSize++; } //判断数组是不是满了 public boolean isFull(){ return this.usedSize==elem.length; }
-
4.查找元素
-
判断是否包含某个元素
-
方法1:通过一个for循环来遍历有效数据来进行判断就行了,这个元素存在返回true,没有这个元素返回false
public boolean contains(int toFind) { for (int i = 0; i < this.usedSize; i++) { if (elem[i]==toFind){ return true; } } return false; }
-
方法2:通过search方法来实现,我们只需要判断search等不等于-1就行了,不等于-1返回true,等于-1返回false
public boolean contains(int toFind) { return search(toFind)!=-1; }
-
5.查找元素对应的位置
-
只需要一个for循环来遍历有效数据来进行判断就行了,这个元素存在返回所在位置的索引,如果没有返回-1
-
代码实现
public int search(int toFind) { for (int i = 0; i < this.usedSize; i++) { if (elem[i]==toFind){ return i; } } return -1; }
6.通过索引找元素
-
1.要判断索引的合法性
-
2.判断不是空表
-
3.前面两步合法返回elem[索引]就行了
// 获取 pos 位置的元素 public int getPos(int pos) { if(pos<0||pos>=this.usedSize){ System.out.println("pos位置不合法!"); } if(isEmpty()){ System.out.println("顺序表为空!"); } return elem[pos]; } public boolean isEmpty(){ return this.usedSize==0; }
7.修改元素
-
1.判断索引pos的合法性
-
2.把要新的值放到原来的值上面,这样就可以覆盖原来的值
//给 pos 位置的元素设为 value public void setPos(int pos, int value) { if(pos<0||pos>=this.usedSize){ System.out.println("pos位置不合法!"); } elem[pos]=value; }
8.通过元素来删除
-
思维图
-
1.要判断顺序表是不是为空,为空直接结束
-
2.要判断又没有要删的元素,没有直接结束
-
3.开始移动数据
-
4.usedSize–
//删除第一次出现的关键字key 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 < usedSize-1; i++) { elem[i]=elem[i+1]; } this.usedSize--; }
9.清空顺序表
-
直接要usedSize=0就行了,因为现在我们写的是一个整型的,如果是引用类型的就要给每个元素一个null
public void clear() { this.usedSize = 0; /*for (int i = 0; i < usedSize; i++) { this.elem[i] = null; } this.usedSize = 0; */ }
到这里我们就从零到有写的一个顺序表(整型的),顺序写下来无非就是CRUD,我们要注意的是表里面的东西,如:是不是空表,索引有没有越界等等。添加的数据一定要从最后一个开始移,不然数据会被覆盖掉,删除的时候要从删的元素的后一个开始移,也是为了避免被覆盖掉。
三.顺序表完整代码
Text
package com.weii;
/**
* Created with IntelliJ IDEA.
* Description:
* User:WLW
* Data:2021-11-03
* Time:15:29
*/
public class Text {
public static void main(String[] args) {
MyArrayList myArrayList=new MyArrayList();
myArrayList.add(11);
myArrayList.add(22);
myArrayList.add(33);
myArrayList.add(44);
myArrayList.add(55);
myArrayList.display();
myArrayList.add(myArrayList.size(),99);
System.out.println(myArrayList.size());
System.out.println(myArrayList.contains(222));
System.out.println(myArrayList.search(55));
System.out.println(myArrayList.getPos(2));
myArrayList.setPos(0,100);
myArrayList.setPos(myArrayList.size()-1,100);
myArrayList.remove(22);
myArrayList.clear();
myArrayList.display();
}
}
MyArrayList
package com.weii;
import java.lang.reflect.Array;
import java.util.Arrays;
/**
* Created with IntelliJ IDEA.
* Description:
* User:WLW
* Data:2021-11-03
* Time:15:29
*/
public class MyArrayList {
private int usedSize;//有效数据个数
private int[] elem;
public MyArrayList(){
this.elem=new int[10];
}
public int size() {
return this.usedSize;
}
// 打印顺序表
public void display() {
System.out.print("[");
for (int i = 0; i < this.usedSize; i++) {
if (i!=0) {System.out.print(",");}
System.out.print(elem[i]);//打印
}
System.out.print("]");
System.out.println();
}
//在后面插入元素
public void add(int data){
// elem[usedSize++]=data;
add(usedSize,data);
}
// 在 pos 位置新增元素
public void add(int pos, int data) {
if(pos<0||pos>this.usedSize){
System.out.println("pos 位置不合法!");
}
if(isFull()){
this.elem= Arrays.copyOf(this.elem,this.elem.length*2);//扩容
}
for (int i = usedSize-1; i >=pos ; i--) {
elem[i+1]=elem[i];
}
elem[pos]=data;
usedSize++;
}
public boolean isFull(){
return this.usedSize==elem.length;//判断数组是不是满了
}
// 判定是否包含某个元素
public boolean contains(int toFind) {
// for (int i = 0; i < this.usedSize; i++) {
// if (elem[i]==toFind){
// return true;
// }
// }
// return false;
return search(toFind)!=-1;
}
// 查找某个元素对应的位置
public int search(int toFind) {
for (int i = 0; i < this.usedSize; i++) {
if (elem[i]==toFind){
return i;
}
}
return -1;
}
// 获取 pos 位置的元素
public int getPos(int pos) {
if(pos<0||pos>=this.usedSize){
System.out.println("pos位置不合法!");
}
if(isEmpty()){
System.out.println("顺序表为空!");
}
return 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位置不合法!");
}
elem[pos]=value;
}
//删除第一次出现的关键字key
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 < usedSize-1; i++) {
elem[i]=elem[i+1];
}
this.usedSize--;
}
// 清空顺序表
public void clear() {
this.usedSize=0;
}
}