一、顺序表的概念:
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。
二、顺序表的主要特点:
- 支持随机访问能力(可以高效的按下标操作)
- 尾插效率比较高(如果触发扩容,代价比较大)
三、顺序表分类:
- 静态顺序表:使用定长数组存储。
- 动态顺序表:使用动态开辟的数组存储。
四、顺序表的基本操作:
1、顺序表的初始化:
将未初始化的顺序表初始化为空表。
public class SeqList {
//datas数组中存储元素的最大个数
private int[] datas = new int[100];
//size代表有效元素个数
private int size = 0;
public void display() {
String result = "[";
for (int i = 0; i < size; i++) {
result += datas[i];
if (i != size - 1) {
result += ",";
}
}
result += "]";
System.out.println(result);
}
}
2、顺序表的插入操作
(1)判断pos是否是有效值。
(2)尾插:把新元素放到下标为 size 的位置上。
(3)普通位置插入:先搬运,在插入。
注意:扩容问题。防止插入元素过多导致的溢出。
public class SeqList {
private int[] datas = new int[100];
private int size = 0;
public void add(int pos, int data) {
//扩容
if(pos>=datas.length) {
int[] newDatas = new int[2 * datas.length];
for (int i = 0; i < datas.length; i++) {
newDatas[i] = datas[i];
}
//数组是引用类型,数组名中保存的是一个地址,改变datas的指向。
datas = newDatas;
}
//判定pos是否是有效值
if (pos < 0 || pos > size) {
return;
}
//尾插
if (pos == size) {
datas[pos] = data;
size++;
return;
}
//普通位置插入
for(int i=size-1;i>=pos;i--){
datas[i+1]=datas[i];
}
datas[pos]=data;
size++;
}
}
3、判定是否包含某个元素
(1)遍历有效元素个数进行比较。
(2)如果发现某个元素和 toFind 相等, 返回 true。
(3)如果所有元素都找完了, 也没找到相等的, 就返回 false。
public class SeqList {
private int[] datas = new int[100];
private int size = 0;
ublic boolean contains(int toFind){
for(int i=0;i<size;i++){
if(datas[i]==toFind){
return true;
}
}
return false;
}
}
4、查找某个元素对应的位置
(1)遍历有效元素个数进行比较。
(2)如果某个元素和toFind相等,返回下标值。
(3)如果所有元素都找完了, 也没找到相等的, 就返回-1。
public class SeqList {
private int[] datas = new int[100];
private int size = 0;
public int search(int toFind){
for(int i=0;i<size;i++){
if(datas[i]==toFind){
return i;
}
}
return -1;
}
}
5、获取 pos 位置的元素
public class SeqList {
private int[] datas = new int[100];
private int size = 0;
public int getPos(int pos){
return datas[pos];
}
}
6、给 pos 位置的元素设为 value
public class SeqList {
private int[] datas = new int[100];
private int size = 0;
public void setPos(int pos, int value){
datas[pos]=value;
}
}
7、删除第一次出现的关键字toRemove
(1)调用search方法判断该元素是否存在,查找目标元素下标。
(2)尾删:直接使用size–删除最后一个元素即可。
(3)普通位置删除:从目标元素的下标开始遍历,到size-1结束。先搬运, 再删除
public class SeqList {
private int[] datas = new int[100];
private int size = 0;
public int search(int toFind){
for(int i=0;i<size;i++){
if(datas[i]==toFind){
return i;
}
}
return -1;
}
public void remove(int toRemove){
int pos=search(toRemove);
if(pos==-1){
return;
}
//如果是最后一个元素,直接尾删即可
if(pos==size-1){
size--;
return;
}
//普通位置删除
for(int i=pos;i<size-1;i++){
datas[i]=datas[i+1];
}
size--;
}
}
8、 获取顺序表长度
size 这个成员只能提供 get 方法, 不能提供 set方法。size 是通过是增删方法进行维护的。
public class SeqList {
private int[] datas = new int[100];
private int size = 0;
public int getSize(){
return size;
}
}
9、清空顺序表
public class SeqList {
private int[] datas = new int[100];
private int size = 0;
public void clear(){
size=0;
}
}