顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
class TestSqlist {
private int[] elem; //存放数据元素的数组
private int usedsize; //有效数据个数
public TestSqlist() { //无参构造
this(10);
}
public TestSqlist(int size) { //指定数组大小,对其进行初始化
this.elem = new int[size];
this.usedsize = 0;
}
private boolean isFull() { //判满
if (this.usedsize == this.elem.length) {
return true;
}
return false;
}
public boolean isEmpty() { //判空
if (this.usedsize == 0) {
return true;
}
return false;
}
public boolean insert(int pos,int val) { //插入
if (isFull()) { //在数组满时进行扩容操作
//二倍扩容
this.elem = Arrays.copyOf(this.elem,this.elem.length*2);
}
//参数合法性校验
if (pos < 0 || pos > this.usedsize) {
return false;
} else {
for (int i = this.usedsize-1;i >= pos;i--) {
this.elem[i+1] = this.elem[i];
}
this.elem[pos] = val;
this.usedsize++;
}
return true;
}
public int search(int key) { //查找
if (isEmpty()) {
return -1;
} else {
for (int i = 0; i < this.usedsize; i++) {
if (this.elem[i] == key) {
return i;
}
}
}
return -1; //key不存在则返回-1
}
public boolean delete(int key) { //删除第一次出现的key
int index = search(key); //获取待删除元素的位置
if (index == -1) {
return false;
} else {
for (int i = index;i < usedsize-1;i++) {
this.elem[i] = this.elem[i+1]; //将后面的元素向前移动一个位置
}
//上面覆盖操作也可以用数组的拷贝来实现
//System.arraycopy(this.elem,index+1,this.elem,index,this.usedsize-index-1);
this.usedsize--;
}
return true;
}
public int getPos(int pos) { //得到pos位置的值
//参数合法性校验
if (isEmpty() || pos < 0 || pos > this.elem.length) {
throw new UnsupportedOperationException("pos位置不合法或顺序表为空"); // 不支持的操作异常
} else {
return this.elem[pos];
}
}
public void show() { //打印(重写toString()也可以)
for (int i = 0;i < usedsize;i++) {
System.out.print(this.elem[i] + " ");
}
System.out.println();
}
}