相信大家在大学学习数据结构的时候大学的教材大多数是采用C语言版本实现的吧!那么大家有没有考虑过如何用Java语言来实现这些数据结构呢?关注我,我将持续把所有的数据结构都用Java重新写一遍,希望能对想学好的同学们有所帮助!
有疑问的可以留言或者私信,看到了就会一一解答的。
package sequenceList;
import java.util.Iterator;
public class SequenceList<T> implements Iterable<T>{ //iterate :重复,反复
//存储元素的数组
private T[] eles;
//记录当前顺序表中元素的个数
private int N;
//构造方法
public SequenceList(int capacity){
//初始化数组
this.eles=(T[])new Object[capacity]; //new一个object类型的数组然后强转成T类型数组
//初始化长度
this.N=0;
}
//将线性表置为空表
public void clear(){
this.N=0;
}
//判断当前线性表是否为空表
public boolean isEmpty(){
return N==0;
}
//获取线性表的长度
public int length(){
return N;
}
//获取指定位置的元素
public T get(int i){
return eles[i];
}
//向线性表中添加元素t
public void insert(T t){
if(N==eles.length){ //如果元素个数等于数组长度,就代表无法添加元素,需要扩容
resize(eles.length*2);
}
eles[N++]=t; //每添加一个元素,N(线性表长度)的值会自增一个
}
//在i处插入元素t
public void insert(int i,T t){
if(N==eles.length){ //如果元素个数等于数组长度,就代表无法添加元素,需要扩容
resize(eles.length*2);
}
//先把i索引处极其后面的元素依次向后移动一位
for(int index=N;index>i;index--){
eles[index]=eles[index-1];
}
//再把t元素放到i索引处即可
eles[i]=t;
//元素个数+1
N++;
}
//删除指定索引i处的值,并返回该元素
public T remove(int i){
//记录索引i处的值
T current=eles[i];
//索引i后面的元素依次向前移动一位即可
for(int index=i;index<N-1;index++){
eles[index]=eles[index+1];
}
//元素个数也应该-1
N--;
if(N<eles.length/4){ //如果移除元素后发现元素个数不足数组长度的四分之一我们就对其进行缩容
resize(eles.length/2);
}
return current;
}
//查找t元素第一次出现的位置
public int indexOf(T t){
for(int i=0;i<N;i++){
if(eles[i].equals(t)){
return i;
}
}
return -1;
}
//根据参数newsize重置eles的大小
public void resize(int newsize){
//定义一个临时数组
T[] temp=eles;
//创建新数组
eles=(T[])new Object[newsize]; //强制转换
//把原数组的数据拷贝到新数组即可
for(int i=0;i<N;i++){
eles[i]=temp[i];
}
}
@Override //该方法使得sequence也能支持foreach循环
public Iterator<T> iterator() {
// TODO Auto-generated method stub
return new SIterator(); //返回内部类对象
}
private class SIterator implements Iterator{
private int cusor; //eles的指针
public SIterator() {
// TODO Auto-generated constructor stub
this.cusor=0;
}
@Override
public boolean hasNext() { //判断当前容器中还有没有下一个元素
// TODO Auto-generated method stub
return cusor<N;
}
@Override
public Object next() { //获取当前容器中的下一个元素
// TODO Auto-generated method stub
return eles[cusor++];
}
}
}