数据结构——顺序表(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、清空顺序表并验证它确实为空

相关推荐
金古圣人8 小时前
hot100 子串
数据结构·c++·算法·leetcode
jinmo_C++10 小时前
2020年_408统考_数据结构41题
数据结构·c++·考研
悟能不能悟10 小时前
快速排序算法详解
数据结构·算法·排序算法
JuneXcy11 小时前
指针高级(3)
数据结构·算法
zhuoya_11 小时前
子串:最小覆盖子串
java·数据结构·算法·leetcode
only-qi12 小时前
leetcode111. 二叉树的最小深度
数据结构·算法
1白天的黑夜112 小时前
哈希表-219.存在重复元素II-力扣(LeetCode)
数据结构·c++·leetcode
好好研究14 小时前
力扣字符串刷题-六道题记录-1
数据结构·算法·leetcode
obroccolio15 小时前
【C++题解】关联容器
开发语言·数据结构·c++·算法