IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构线性表之顺序表 -> 正文阅读

[数据结构与算法]数据结构线性表之顺序表


线性表

线性表是最基本,最简单,也是最常用的一种数据结构。一个线性表是n个具有相同特性的数据元素的优先序列

前驱元素:

	若A元素在B元素的前面,则称A为B的前驱元素

后继元素:

	若B元素在A元素的后面,则称B为A元素的后继元素

特征

数据元素之间有一对一的逻辑关系

  • 第一个数据元素没有前驱,称为头结点
  • 最后一个元素没有后继,这个元素称为尾节点
  • 除了第一个和最后一个数据元素外,其他数据元素有且仅有一个前驱和后继

分类

线性表中的数据存储方式可以是顺序存储,也可以是链式存储,按照数据存储方式不同,可以把线性表分为顺序表和链表

顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元,依次存储线性表中的各个元素,使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反应数据元素之间逻辑上的相邻关系

API实现

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];
    }

    //向线型表中添加元素t
    public void insert(T t){
       
        eles[N++]=t;
    }

    //在i元素处插入元素t
    public void insert(int i,T t){
      

        //先把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--;

     
        return current;
    }


    //查找t元素第一次出现的位置
    public int indexOf(T t){
        for(int i=0;i<N;i++){
            if (eles[i].equals(t)){
                return i;
            }
        }
        return -1;
    }



    @Override
    public Iterator<T> iterator() {
        return new SIterator();
    }

    private class SIterator implements Iterator{
        private int cusor;
        public SIterator(){
            this.cusor=0;
        }
        @Override
        public boolean hasNext() {
            return cusor<N;
        }

        @Override
        public Object next() {
            return eles[cusor++];
        }
    }
}

测试

public class SequenceListTest {
    public static void main(String[] args) {
        //创建顺序表对象
        SequenceList<String> s1 = new SequenceList<String>(10);
        s1.insert("姚明");
        s1.insert("科比");
        s1.insert("麦迪");
        s1.insert(1,"詹姆斯");

        String  getResult = s1.get(1);
        System.out.println(getResult);

        String removeResult = s1.remove(1);
        System.out.println(removeResult);

        s1.clear();
        System.out.println(s1.length());
    }
}

顺序表的容量可变

public class SequenceListTest2 {
    public static void main(String[] args) {
        SequenceList<String> s1 = new SequenceList<>(3);
        s1.insert("张三");
        s1.insert("李四");
        s1.insert("王五");
        s1.insert("赵六");

    }
}

在创建数组时,我们初始化为3,当插入的元素大于三就会越界。

我们期望得到的是可变容量的数组,即在加入的元素超出初始值时,直接将容量扩充到二倍,当数据元素数量少于1/4时,则将容量缩减为当前的1/2

   public void resize(int newSize){
        //定义一个临时数组,指向原数组
        T[] temp=eles;
        //创建新数组
        eles=(T[])new Object[newSize];
        //把原数组的数据拷贝到新数组即可
        for(int i=0;i<N;i++){
            eles[i]=temp[i];
        }
    }

添加元素时:

public void insert(int i,T t){
    if (N==eles.length){
        resize(2*eles.length);
    }

    //先把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;

}

顺序表的时间复杂度分析

get:

一次操作即可得到该元素,所以时间复杂度为O(1)

insert:

由于在添加元素时,会将元素向后移动一位

最坏情况:O(n)

最好情况:O(1)

remove:

删除该元素,会影响后续元素的位置

最坏情况:O(n)

由于顺序表底层是

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 11:59:24  更:2021-08-16 12:01:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:20:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码