顺序表是用一段物理,地址连续的存储单元;依次存储数据元素的线性结构
一般情况下采用数组存储,在数组 上完成数据的增删查改。
顺序表一般可以分为:
- 静态顺序表:使用定长数组存储。 2. 动态顺序表:使用动态开辟的数组存储
静态顺序表只适用于确定知道需要存多少数据的场景。
静态顺序表的定长数组导致N定大了,空间开多 了浪费,开少了不够用。
所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,
因此本文借用数组实现动态顺序表的基本操作:增删改除等
public class MySequenceImpl implements ISequence {
private Object[] elem;//属性
private int usedSize;//有效数据个数
private static final int DEFAULT_SIZE = 10;//默认数据容量为10
public MySequenceImpl() {//构造函数
this.elem = new Object[DEFAULT_SIZE];//初始化
this.usedSize = 0;
}
private boolean isFull() {
/*if(this.usedSize == this.elem.length) {
return true;
}
return false;*/
return this.usedSize == this.elem.length;
}
public boolean add(int pos, Object data) {
//1、pos位置的合法性进行判断
if (pos<0||pos>this.usedSize){
return false;}
//2、判断是否为满。
if (isFull()){
//2倍扩容
this.elem= Arrays.copyOf(this.elem,
2*this.elem.length) ;
}
for (int i=this.usedSize-1;i>=pos;i--){
this.elem[i+1]=this.elem[i];
}
this.elem[pos]=data;
usedSize++;
return false;
}
private boolean isEmpty(){
return this.usedSize==0;
}
public int search(Object key) {
if (isEmpty()){//为空返回-1
return -1;
}
for (int i=0;i<this.usedSize;i++){
if (this.elem[i].equals(key)){
return i;//多个相同返回第一个
}
}
return -1;
}
public boolean contains(Object key) {
if (isEmpty()){
return false;
}
for (int i=0;i<this.usedSize;i++){
if (this.elem[i].equals(key)){
return true;
}
}
return false;
}
public Object getPos(int pos) {
if (pos<0||pos>= this.usedSize){
return null;
}
return this.elem[pos];
}
public Object remove(Object key) {//删除
int index=search(key);
if (index==-1){//没有key
return null;
}
Object data=this.elem[index];
for (int i=index;i<this.usedSize-1;i++){
this.elem[i]=this.elem[i+1];
}
return data;
}
public int size() {
return this.usedSize;
}
public void display() {
for (int i=0;i<this.usedSize;i++){
System.out.println(this.elem[i]+"" );
}
System.out.println();
}
public void clear() {//测试内存泄漏
for (int i = 0;i<this.usedSize;i++){
this.elem[i]=null;
}
}
}