线性表的存储方式有两种: 顺序存储和链式存储.本文主要介绍采用顺序存储的线性表-顺序表的基本实现.
根据空间分配方法的不同,顺序表分为静态分配和动态分配两种.
采用动态存储方法在运算过程中如果发生溢出,可以另外开辟一块更存储空间,用以替换原来的存储空间,从而达到扩充存储空间的目的。
顺序表删除算法平均时间复杂度为 O(m)。
顺序表的优点:操作简单,能够随机存取,只需要 O(1)的时间就可以取出第i个元素。
顺序表的缺点:需要预先分配最大空间,最大空间数估计过大或过小会造成空间浪费或溢出。插入和删除操作需要移动大量元素(以下代码实现未包括删除)。
具体的代码实现:
public class SeqList {
//打印顺序表
public void display(){}
//新增元素
public void add(int pos, int data){}
//判断表中是否包含此元素
public boolean contains(int data){}
//查找元素对应位置
public int search(int data){}
//获取某位置的元素
public int getPos(int pos){}
//设置pos上的元素值
public void setPos(int pos, int data){}
//获取顺序表长度
public int size(){}
}
详细实现:
public class CreatSeqList {
//创建初始变量
public int[] element;
public int length;
public CreatSeqList() {
this.element = new int[];
}
//打印顺序表
public void display() {
for (int i = 0; i < length; i++) {
System.out.print(element[i]);
}
}
//添加元素:首先判断是否需要增容,然后判断下标是否合法,最后插入元素,可以在第一个元素前插入
private boolean isFull() {
if (this.element.length == this.length) {
return true;
}
return false;
}
public void add(int positon, int data) {
if (isFull) {
this.element = Arrays.copyOf(this.element, this element.length * 2);
}
if (position < 0 || position >= this.element.length) {
System.out.println("false position");
}
for (int i = this.length - 1; i >= position; i--) {
this.element[i + 1] = this.element[i];
}
element[position] = data;
this.length++;
}
//判断是否包含元素
public boolean contains(int data){
for(int i = 0; i < element.length; i++){
if(data == element[i]){
return true;
}
}
return false;
}
//同理,查找元素下标
public int search(int data){
for(int i = 0; i < element.length; i++){
if(data == element[i]){
return i;
}
}
return 0;
}
//获取position上元素
public int getPos(int position){
if(position < 0 || position >= element.length){
return 0;
}
return element[position];
}
//更新指定位置元素
public void setPos(int position, int data){
if(position < 0 || position >= element.length){
System.out.println("false");
}
this.element[position] = data;
}
//获取顺序表长度
public int size(){
return this.element.length;
}
}