顺序表
- 概念及结构:
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下,采用数组存储,在数组上完成数据的增删查改。 - 顺序表一般可以分为:
静态顺序表:使用定长数组存储
动态顺序表:使用动态开辟的数组存储- 静态顺序表适用于确定知道需要存放多少数据的场景。
- 静态顺序表的定长数组导致N定大了,空间开辟多了就会浪费, 开少了又不够用。
- 相比之下,动态顺序表更加灵活,根据需要动态的分配空间大小。
动态顺序表源代码如下:
public class SeqList {
private int[] datas = new int[100];
private int size = 0;
// size 这个成员只能提供 get 方法, 不能提供 set
// size 是通过后面是增删方法来进行维护的.
public int getSize() {
return size;
}
//打印顺序表
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);
}
//在pose位置新增元素
// pos 表示新元素要插入的位置(下标).
// data 表示新元素的值
public void add(int pos,int data){
// 判定 pos 是否是有效的值
// 写代码的时候要时刻关注参数的有效性
if(pos < 0 || pos > size) {
return;
}
// 扩容的支持, 顺序表如果容量不够了, 就能自动扩容
if(size >= datas.length) {
int[] newDatas = new int[2*datas.length];
for(int i = 0;i < datas.length;i++){
newDatas[i] = datas[i];
}
datas = newDatas;
}
// 1. 尾插的情况(比较简单的情况)
// 把这个新元素放到下标为 size 的位置上
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++;
}
//判断是否包含某元素
public boolean contains(int toFind) {
// 循环访问每个元素并进行比较.
// 如果发现某个元素和 toFind 相等, 就找到了, 返回 true
// 如果所有元素都找完了, 也没找到相等的, 就返回 false
for(int i = 0;i < size ; i++){
if(datas[i] == toFind){
return true;
}
}
return false;
}
//查找某元素对应的位置
public int search(int toFind){
for (int i = 0; i < size; i++) {
if (datas[i] == toFind) {
return i;
}
}
return -1;
}
//获取pos位置的元素
public int getPos(int pos) {
return datas[pos];
}
//将pos位置的元素设为value
public void setPos(int pos,int value){
datas[pos] = value;
}
//删除第一次出现的关键字key
public void remove(int toRemove){
// 1. 先找到 toRemove 对应的下标
int pos = search(toRemove);
if(pos == -1){
//表示没找到
return;
}
// 2. 如果下标是最后一个元素, 直接尾删即可.
if(pos == size-1){
size--;
return;
}
// 3. 如果下标是中间元素, 需要先搬运, 再删除
for(int i = pos; i < size-1; i++){
datas[i] = datas[i+1];
}
size--;
}
//清空顺序表
public void clear() {
size = 0;
}
}
动态顺序表的部分功能测试
public class Test {
private static void testAdd() {
// 更严谨的测试方式:
// 1. 测试参数非法情况
// 2. 测试扩容功能
// 3. 尾插的逻辑
// 4. 普通位置的插入
SeqList seqList = new SeqList();
seqList.add(0, 100);
seqList.add(0, 200);
seqList.add(0, 300);
seqList.add(0, 400);
seqList.display();
}
private static void testContains(){
SeqList seqList = new SeqList();
seqList.add(0, 10);
seqList.add(0, 20);
seqList.add(0, 30);
seqList.add(0, 40);
System.out.println(seqList.contains(100));
}
private static void testSearch(){
SeqList seqList = new SeqList();
seqList.add(0, 10);
seqList.add(0, 20);
seqList.add(0, 30);
seqList.add(0, 40);
System.out.println(seqList.search(10));
}
private static void testGetPos(){
SeqList seqList = new SeqList();
seqList.add(0, 10);
seqList.add(0, 20);
seqList.add(0, 30);
seqList.add(0, 40);
System.out.println(seqList.getPos(0));
}
private static void testToRemove(){
SeqList seqList = new SeqList();
seqList.add(0, 10);
seqList.add(0, 20);
seqList.add(0, 30);
seqList.add(0, 40);
seqList.display();
seqList.remove(20);
seqList.display();
}
public static void main(String[] args){
testAdd();
testContains();
testSearch();
testGetPos();
testToRemove();
}
}
来源:CSDN
作者:一只懐坏旭
链接:https://blog.csdn.net/qq_45691220/article/details/104760099