线性表 -顺序表

一、线性表

线性表是最基本、最简单、也是最常用的一种数据结构 ,一个线性表是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);
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值