1 顺序表
1.1 概念及其结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可以分为:
- 静态顺序表:使用定长数组存储
- 动态顺序表:使用动态开辟的数组存储。
静态顺序表适用于确定知道需要存多少数据的场景。
静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。
相比之下动态顺序表更灵活, 根据需要动态的分配空间大小。
1.2 接口实现
下面来实现一个动态顺序表:
创建顺序表:
public class MyArrayL{
public int[] elem;
public int usedsize; //顺序表有效数据的个数
public MyArrayL(){
elem = new int[10];
}
}
注意:后面的这些接口都要放在MyArrayL类中
在pos位置添加新元素:
public void addPos(int pos,int data){
if(pos < 0 || pos > usedSize){
System.out.println("pos位置不合法");
return;
}
if(isFull()){
elem = Arrays.copyOf(elem,2*elem.length);
}
for (int i = usedSize - 1; i >= pos; i--) {
elem[i+1] = elem[i];
}
elem[pos] = data;
usedSize++;
}
//判断顺序表是否装满
public boolean isFull(){
return usedSize == elem.length;
}
打印顺序表:
public void showList(){
for (int i = 0; i < usedSize; i++) {
System.out.print(elem[i] + " ");
}
System.out.println();
}
是否包含元素:
public boolean contain(int key){
for (int i = 0; i < usedSize; i++) {
if(elem[i] == key){
return true;
}
}
return false;
}
查找某个元素的位置,不存在就返回-1:
public int toFind(int key){
for (int i = 0; i < usedSize; i++) {
if(elem[i] == key){
return i;
}
}
System.out.println("没有该元素!");
return -1;
}
获取pos位置的元素:
public int getPos(int pos){
if(pos < 0 || pos >= usedSize){
System.out.println("pos位置不合法");
return -1;
} else {
return elem[pos];
}
}
给pos位置的元素设为data:
public void setPos(int pos,int data){
if(pos < 0 || pos >= usedSize){
System.out.println("pos位置不合法");
return;
}else {
elem[pos] = data;
}
}
删除第一次出现的关键字key:
public void delKey(int key){
int index = toFind(key);
if(index == -1){
System.out.println("不存在key");
return;
} else {
for (int i = index; i < usedSize - 1; i++) {
elem[i] = elem[i+1];
}
usedSize--;
}
}
清空顺序表:
若顺序表中装的是普通类型,则可以直接将usedSize置为0;若顺序表中装的是引用类型则需要全部置为null:
public void clear(){
for (int i = 0; i < usedSize; i++) {
elem[i] = null;
}
}