packagecom.clarck.datastructure.linear;/*** 顺序表(线性表的顺序存储结构)类,实现线性表接口,T是泛型参数,指定任意类
*
*@authorclarck
*
*@param*/
public class SeqList implements LList{/*** 对象数组,保护成员*/
protectedObject[] element;/*** 顺序表长度,记载元素个数*/
protected intlen;/*** 默认构造方法,创建默认容量的空表*/
publicSeqList() {this(64);
}/*** 构造方法,创建容量为size的空表
*
*@paramsize*/
public SeqList(intsize) {this.element = newObject[size];this.len = 0;
}/*** 判断顺序表是否空,若空返回true,O(1)*/@Overridepublic booleanisEmpty() {return this.len == 0;
}/*** 返回顺序表长度,O(1)*/@Overridepublic intlength() {return this.len;
}/*** 返回第i(≥0)个元素。若i<0或大于表长则返回null,O(1)*/@SuppressWarnings("unchecked")
@Overridepublic T get(inti) {if (i >= 0 && i < this.len) {return (T) this.element[i];
}return null;
}/*** 设置第i(≥0)个元素值为x。若i<0或大于表长则抛出序号越界异常;若x==null,不操作*/@Overridepublic void set(inti, T x) {if (x == null)return;if (i >= 0 && i < this.len) {this.element[i] =x;
}else{throw new IndexOutOfBoundsException(i + ""); //抛出序号越界异常
}
}/*** 顺序表的插入操作 插入第i(≥0)个元素值为x。若x==null,不插入。 若i<0,插入x作为第0个元素;若i大于表长,插入x作为最后一个元素*/@Overridepublic void insert(inti, T x) {if (x == null)return;//若数组满,则扩充顺序表容量
if (this.len ==element.length) {//temp也引用elements数组
Object[] temp = this.element;//重新申请一个容量更大的数组
this.element = new Object[temp.length * 2];//复制数组元素,O(n)
for (int j = 0; j < temp.length; j++) {this.element[j] =temp[j];
}
}//下标容错
if (i < 0)
i= 0;if (i > this.len)
i= this.len;//元素后移,平均移动len/2
for (int j = this.len - 1; j >= i; j--) {this.element[j + 1] = this.element[j];
}this.element[i] =x;this.len++;
}/*** 在顺序表最后插入x元素*/@Overridepublic voidappend(T x) {
insert(this.len, x);
}/*** 顺序表的删除操作 删除第i(≥0)个元素,返回被删除对象。若i<0或i大于表长,不删除,返回null。*/@SuppressWarnings("unchecked")
@Overridepublic T remove(inti) {if (this.len == 0 || i < 0 || i >= this.len) {return null;
}
T old= (T) this.element[i];//元素前移,平均移动len/2
for (int j = i; j < this.len - 1; j++) {this.element[j] = this.element[j + 1];
}this.element[this.len - 1] = null;this.len--;returnold;
}/*** 删除线性表所有元素*/@Overridepublic voidremoveAll() {this.len = 0;
}/*** 查找,返回首次出现的关键字为key元素*/@SuppressWarnings("unchecked")
@OverridepublicT search(T key) {int find = this.indexOf(key);return find == -1 ? null : (T) this.element[find];
}/*** 顺序表比较相等 比较两个顺序表是否相等 ,覆盖Object类的equals(obj)方法,O(n)*/@SuppressWarnings("unchecked")
@Overridepublic booleanequals(Object obj) {if (this ==obj)return true;if (obj instanceofSeqList) {
SeqList list = (SeqList) obj;//比较实际长度的元素,而非数组容量
for (int i = 0; i < this.length(); i++) {if (!this.get(i).equals(list.get(i))) {return false;
}
}return true;
}return false;
}/*** 顺序查找关键字为key元素,返回首次出现的元素,若查找不成功返回-1
*
*@paramkey
* 可以只包含关键字数据项,由T类的equals()方法提供比较对象相等的依据
*@return
*/
public intindexOf(T key) {if (key != null) {for (int i = 0; i < this.len; i++) {//对象采用equals()方法比较是否相等
if (this.element.equals(key)) {returni;
}
}
}return -1;
}//返回顺序表所有元素的描述字符串,形式为“(,)”,覆盖Object类的toString()方法
publicString toString() {
String str= "(";if (this.len > 0)
str+= this.element[0].toString();for (int i = 1; i < this.len; i++)
str+= ", " + this.element[i].toString();return str + ") "; //空表返回()
}
}