数据结构——顺序表(Java)的基本操作

目录

一.线性表

1.定义:

2.特征:

分类:

二.顺序表

代码实现:

(1)首先对顺序表的初始化创建

(2)清空顺序表

(4)获取元素个数

(5)获取对应索引的元素

(6)在末尾添加元素在末尾添加元素)

(7)在指定位置插入元素

(8)查找某个元素的下标

(9)删除指定元素

补充(10)打印顺序表

练习题:


一.线性表

1.定义:

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

•前驱元素:

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

•后继元素:

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

2.特征:

  1. 第一个数据元素没有前驱,这个数据元素被称为头结点;

  2. 最后一个数据元素没有后继,这个数据元素被称为尾结点;

  3. 除了第一个和最后一个数据元素外,其他数据元素有且仅有一个前驱和一个后继。

分类:

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

二.顺序表

根据前面关于线性表的分类可知,顺序表就是用数组实现对数据的增,删,查,改

关于顺序表的API设计:

我们现在一一实现这些方法:

代码实现:

(1)首先对顺序表的初始化创建

复制代码
class SequenceList<T>
{
    //用于存储元素的数组
    private T[] elem;
    //顺序表中的元素个数
    private int usedSize;
    //-----构造顺序表中的初始容量
    public SequenceList(int capacity)
    {
        elem = (T[]) new Object[capacity];
        this.usedSize = 0;
    }
}

(2)清空顺序表

思路分析:顺序表由数组实现,当我们想要清空顺序表时,只需要将数组的长度重新设置为0即可

复制代码
//----清空顺序列表
    public void clear()
    {
        this.usedSize = 0;
    }

(3)判断顺序表是否为空

思路分析:用数组fasle与0比较,等于0则返回true,不等于0则返回false

复制代码
//------判断列表是否为空
    public boolean isEmpty()
    {
        return usedSize == 0;
    }

(4)获取元素个数

思路分析:我们设置的usedSize是从0开始的因此直接返回就行

复制代码
   public int length()
    {
        return usedSize;
    }

(5)获取对应索引的元素

思路分析:1.先考虑所给索引是否在数组中存在对应的数据,如果给的索引位置不对,则抛出一个异常,停止运行

2.索引位置正确,直接返回

复制代码
 //----获取对应位置的元素
    public T get(int i)
    {
        if(i < 0 || i >= usedSize)
        {
            throw  new RuntimeException("输入位置违规");
        }
        return elem[i];
    }

(6)在末尾添加元素

思路分析:1.先判断数组元素是否已满,如果已满的话,我们需要进行扩容

2.数组从索引0开始,只需要把新元素添加到elem[usedSize] 中即可

3.别忘了将数组元素加一

复制代码
//----如果数组满就对数组进行扩容
    public void checkCapacity()
    {
        if(usedSize == elem.length)
        {
            T[] newElem = (T[]) new Object[elem.length * 2];
        }
    }
//----在末尾添加元素
    public void add(T data)
    {
        //先判断数组元素是否已满,已满则进行扩容
       checkCapacity();
        this.elem[usedSize] = data;
        this.usedSize++;
    }

(7)在指定位置插入元素

思路分析:1.先检查输入的位置是否合规,不合规,则抛出异常,终止运行

2.依然先判断数组元素是否已满

3.插入新元素后,在指定位置后面的元素都要往后退1,我们便从最后一个元素开始挪动,直到挪到了指定位置

复制代码
 //-----在指定位置后面插入元素
    public void add(int index, T data)
    {
        //先检查输入位置是否合法
        if(index < 0 || index > usedSize)
        {
            throw new RuntimeException("输入位置违规");
        }
        //判断数组是否有剩余空间
        checkCapacity();
        //开始从最后一个有效元素挪动
        for(int i=usedSize-1; i>=index; i--)
        {
            this.elem[i+1] = elem[i];
        }
        elem[index] = data;
        usedSize++;
    }

(8)查找某个元素的下标

思路分析:使用循环,遍历数组,用equals函数找到我们想要的元素,这时对应的下标也找到了

复制代码
//----查找某个元素的下标位置
    public  int indexOf(T toFund)
    {
        //从头变例数组,用一个equals函数找到与toFund相等的元素,找不到就返回-1
        for(int i=0; i<usedSize; i++)
        {
            if( elem[i].equals(toFund))
            {
                return i;
            }
        }
        return -1;
    }

(9)删除指定元素

思路分析:1.首先需要找到元素所对应的索引,如果没找到就返回

2.类比在指定位置添加元素,我们应该从被删除后的下一个元素开始依次往前挪动1

复制代码
//-----删除指定元素
    public boolean remove(T key)
    {
        //找到数据对应的索引
        int index =indexOf(key);
        if(index ==-1)
        {
            System.out.println("未找到该数据");
            return false;
        }
       //从删除元素的后一位开始挪动
        for(int i=index+1; i<=usedSize-1; i++)
       {
           this.elem[i-1] = elem[i];
       }
        usedSize--;
       return true;
    }

补充(10)打印顺序表

思路分析:用循环遍历数组即可

复制代码
//-----打印顺序表中的学生姓名
    public void printAll()
    {
        for (int i=0; i<usedSize; i++)
        {
            System.out.println(elem[i]);
        }
    }

让我们通过一道练习题,检验这些方法

练习题:

假设你正在开发一个简单的学生管理系统,使用顺序表(SequenceList)来存储学生姓名。请完成以下任务:

1、创建一个可以存储字符串的顺序表,初始容量为10

2、添加以下学生姓名到顺序表中:"张三", "李四", "王五","赵六"。

3、在"李四"后面插入"李四"(注意:需要先找到"李四"的位置)

4、删除"李四"并从顺序表中移除

5、查找"李四"在顺序表中的位置(索引)

6、打印最终顺序表中的所有学生姓名

7、清空顺序表并验证它确实为空

相关推荐
小欣加油1 天前
leetcode 1018 可被5整除的二进制前缀
数据结构·c++·算法·leetcode·职场和发展
无敌最俊朗@1 天前
链表-力扣hot100-随机链表的复制138
数据结构·leetcode·链表
玖剹1 天前
递归练习题(四)
c语言·数据结构·c++·算法·leetcode·深度优先·深度优先遍历
Mz12211 天前
day04 小美的区间删除
数据结构·算法
希望有朝一日能如愿以偿1 天前
力扣每日一题:能被k整除的最小整数
数据结构·算法·leetcode
Rock_yzh1 天前
LeetCode算法刷题——128. 最长连续序列
数据结构·c++·算法·哈希算法
xiaoye-duck2 天前
计数排序:高效非比较排序解析
数据结构
稚辉君.MCA_P8_Java2 天前
通义 插入排序(Insertion Sort)
数据结构·后端·算法·架构·排序算法
无限进步_2 天前
C语言动态内存的二维抽象:用malloc实现灵活的多维数组
c语言·开发语言·数据结构·git·算法·github·visual studio
Swift社区2 天前
LeetCode 432 - 全 O(1) 的数据结构
数据结构·算法·leetcode