一、线性表
线性表是最基本、最简单、也是最常用的一种数据结构 ,一个线性表是N个具有相同特性的数据元素的优先序列
前驱元素:
若A元素在B元素的前面 则成为A为B的前驱元素
后继元素:
若b元素在A元素的后面 责成B为A的后级元素
二、线性表的特征∶
数据元素之间具有一种“—对一的逻辑关系。
1.第一个数据元素没有前驱,这个数据元素被称为头结点;
2.最后一个数据元素没有后继,这个数据元素被称为尾结点;
3.除了第一个和最后一个数据元素外,其他数据元素有且仅有一个前驱和一个后继。
三、线性表的分类
线性表中数据存储的方式可以顺序存储,也可以是链式存储 ,按照数据的存储方式不同,可以把线性表分为顺序表和链表
2顺序表的容量可变
当我们使用是群策List时 先new SqequenceList(5)创建一个对象,创建对象时就需要指定容器的大小 ,初始化指定大小的数组来存储元素,当我们插入元素时,如果已经插入了5个元素 还要继续插入数据,则会报错,就不能呢过插入了 这种设计不符合容器的设计概念,因此我们在设计顺序表示 ,应该考虑它的容量的伸缩性。
考虑容器的容量伸缩性,其次就是改变存储数据元素的数组的大小,那我们需要考虑什么时候需要改变数组的大小?
1添加元素是时:
添加元素时 应该检查当前数组的大小是否能够容纳新的元素,如果不能容纳·,则需要创建新的容量更大的数组,我们这里创建一个是原数组两倍容量的新数组存储元素
2移除元素时
四、代码实现
package 数据结构;
import java.util.Iterator;
/**
* @author chao
*
* 顺序表
* @create -05-2022-05-22-20:06
*/
public class SequenceList<T> implements Iterable{
//存储元素的数组
private T[] eles;
//记录顺序表中的元素个数
private int N;
public SequenceList(int capacity){
//初始化数组
this.eles=(T[])new Object[capacity];
//初始化长度
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];
}
//向线性表添加元素
public void insert(T t){
if(N==eles.length)
{
resize(eles.length*2);
}
eles[N++]=t;
}
//在i匀速处插入元素t
public void insert(int i,T t){
if(N==eles.length)
{
resize(eles.length*2);
}
//先把i所引出元素机器后面元素一次向后移动一位
for (int j = N; j >i; j--) {
eles[j]=eles[j-1];
}
eles[i]=t;
N++;
//再把t元素方法哦i
}
//删除指定位置i出的元素 并返回该元素
public T remove(int i){
//记录索引i处的值
T current=eles[i];
//索引i后面的值一次向前
for (int j = i; j <N-1 ; j++) {
eles[j]=eles[j+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;
}
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
public Iterator iterator() {
return new SIyerator();
}
private class SIyerator implements Iterator{
private int cusor;
public SIyerator(){
this.cusor=0;
}
@Override
public boolean hasNext() {
return cusor<N;
}
@Override
public Object next() {
return eles[cusor++];
}
}
}
测试代码
package 数据结构.Test;
import 数据结构.SequenceList;
/**
* @author chao
* @create -06-2022-06-22-19:26
*/
public class SequenListTest {
public static void main(String[] args) {
SequenceList<String> s1=new SequenceList<>(10);
s1.insert("姚明");
s1.insert("科比");
s1.insert("麦迪");
s1.insert(1,"詹姆斯");
String getresult=s1.get(1);
for (Object o : s1) {
System.out.println(o);
}
System.out.println("索引1处的结果为+"+getresult);
String remove = s1.remove(2);
System.out.println("删除的元素为"+remove);
System.out.println(s1.length());
for (Object o : s1) {
System.out.println(o);
}
}
}