java - 数据结构,顺序表

1、顺序表和链表都属于数据结构的一部分。
2、数据结构:C的数据结构和JAVA的数据结构有什么不一样啊?
数据结构只是一个单独的学科,和语言没有关系。
用不同的语言实现一样的逻辑。

一、线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
在这里插入图片描述

二、顺序表 - ArrayList

2.1、概念及结构

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改

顺序表一般可以分为:

  • 静态顺序表:使用定长数组存储。
  • 动态顺序表:使用动态开辟的数组存储

静态顺序表适用于确定知道需要存多少数据的场景.
静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用
相比之下动态顺序表更灵活, 根据需要动态的分配空间大小.
在这里插入图片描述

2.2、模拟实现顺序表 - MyArrayList

2.2.1、顺序表的属性

public class MyArrayList {
    //存储数据的数组
    public int[] elem;
    //usedSize 拿到的是 数组元素的有效个数
    public int usedSize;

    public MyArrayList(){
        //构造方法,初始化数组的大小为10
        this.elem = new int[10];
    }
}

在这里插入图片描述

2.2.2、顺序表的方法

打印顺序表
// 打印顺序表
    public void display() {
        for(int i = 0; i < usedSize; i++){
            System.out.print(elem[i] + " ");
        }
        System.out.println();
    }

在这里插入图片描述

获取顺序表长度
// 获取顺序表长度
    public int size() {
    	//usedSize 就是数组元素的有效数据个数,所以这就是顺序表的长度
        return usedSize;
    }
在 pos 位置新增元素
// 在 pos 位置新增元素
    public void add(int pos, int data) {
        if(pos < 0 || pos > usedSize){
            System.out.println(pos + "位置不合法,增加失败!");
            return;
        }
        if(isFull()) {
            //扩容,如果顺序表满了,就扩容,没有满就不扩容
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //向后移元素
        for (int i = usedSize - 1; i > pos ; i--) {
            this.elem[i+1] = this.elem[i];
        }
        //插入元素
        this.elem[pos] = data;
        //有效数据+1
        usedSize++;
    }

    //判断数组是否满了,如果满了返回true,没有满返回false
    public boolean isFull(){
        return this.usedSize == this.elem.length;
    }

在这里插入图片描述

判定是否包含某个元素
// 判定是否包含某个元素
    public boolean contains(int toFind) {
        for(int i = 0; i < usedSize; i++){
            if(elem[i] == toFind){
                return true;
            }
        }
        return false;
    }
查找某个元素对应的位置
 // 查找某个元素对应的位置,找到返回该元素下标,没找到返回-1
    public int search(int toFind) {
        for(int i = 0; i < this.usedSize; i++){
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }
获取 pos 位置的元素
// 获取 pos 位置的元素
    public int getPos(int pos) {
        if(pos < 0 || pos > this.usedSize){
            System.out.println("pos位置不合法!");
            return -1;
        }
        return this.elem[pos];
    }
给 pos 位置的元素设为 value
// 给 pos 位置的元素设为 value
    public void setPos(int pos, int value) {
        if(pos < 0 || pos > this.usedSize){
            System.out.println("pos位置不合法!");
            return;
        }
        this.elem[pos] = value;
    }
删除第一次出现的关键字
// 查找某个元素对应的位置,找到返回该元素下标,没找到返回-1
    public int search(int toFind) {
        for(int i = 0; i < this.usedSize; i++){
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }


    //删除第一次出现的关键字key
    public void remove(int toRemove) {
        //判断顺序表是否为空
        if(this.usedSize == 0){
            System.out.println("顺序表为空,删除失败");
            return;
        }
        //index == -1,说明没有这个数据
        int index = search(toRemove);
        if(index == -1){
            System.out.println("没有你要找的数据");
            return;
        }
        //移动元素
        for(int i = index; i < this.usedSize-1; i++){
            this.elem[i] = this.elem[i+1];
        }
        //记录有效数据
        this.usedSize--;
    }
清空顺序表
public void clear() {
        this.usedSize = 0;
    }
测试

在进行测试的时候,两边中间都要测试


public class TestDome {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(0,55);
        myArrayList.add(1,30);
        myArrayList.add(2,5);
        myArrayList.add(3,5);
        myArrayList.display();

        myArrayList.remove(55);
        myArrayList.display();
        myArrayList.clear();
        myArrayList.display();

    }
}

模拟实现 - MyArrayList

public class MyArrayList {
    //存储数据的数组
    public int[] elem;
    //usedSize 拿到的是 数组元素的有效个数
    public int usedSize;

    public MyArrayList(){
        //构造方法,初始化数组的大小为10
        this.elem = new int[10];
    }

    // 打印顺序表
    public void display() {
        for(int i = 0; i < usedSize; i++){
            System.out.print(elem[i] + " ");
        }
        System.out.println();
    }

    // 获取顺序表长度
    public int size() {
        return usedSize;
    }

    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        if(pos < 0 || pos > usedSize){
            System.out.println(pos + "位置不合法,增加失败!");
            return;
        }
        if(isFull()) {
            //扩容,如果顺序表满了,就扩容,没有满就不扩容
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //向后移元素
        for (int i = usedSize - 1; i > pos ; i--) {
            this.elem[i+1] = this.elem[i];
        }
        //插入元素
        this.elem[pos] = data;
        //有效数据+1
        usedSize++;
    }

    //判断数组是否满了,如果满了返回true,没有满返回false
    public boolean isFull(){
        return this.usedSize == this.elem.length;
    }

    //扩容,如果顺序表满了,就扩容
    public void dilatation(){
        if(this.usedSize == this.elem.length){
            this.elem = Arrays.copyOf(this.elem,this.elem.length*2);
        }
    }

    // 判定是否包含某个元素
    public boolean contains(int toFind) {
        for(int i = 0; i < usedSize; i++){
            if(elem[i] == toFind){
                return true;
            }
        }
        return false;
    }

    // 获取 pos 位置的元素
    public int getPos(int pos) {
        if(pos < 0 || pos > this.usedSize){
            System.out.println("pos位置不合法!");
            return -1;
        }
        return this.elem[pos];
    }
    // 给 pos 位置的元素设为 value
    public void setPos(int pos, int value) {
        if(pos < 0 || pos > this.usedSize){
            System.out.println("pos位置不合法!");
            return;
        }
        this.elem[pos] = value;
    }

    // 查找某个元素对应的位置,找到返回该元素下标,没找到返回-1
    public int search(int toFind) {
        for(int i = 0; i < this.usedSize; i++){
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }


    //删除第一次出现的关键字key
    public void remove(int toRemove) {
        //判断顺序表是否为空
        if(this.usedSize == 0){
            System.out.println("顺序表为空,删除失败");
            return;
        }
        //index == -1,说明没有这个数据
        int index = search(toRemove);
        if(index == -1){
            System.out.println("没有你要找的数据");
            return;
        }
        //移动元素
        for(int i = index; i < this.usedSize-1; i++){
            this.elem[i] = this.elem[i+1];
        }
        //记录有效数据
        this.usedSize--;
    }

    // 清空顺序表
    public void clear() {
//        for(int i = this.usedSize - 1; i <= 0; i--){
//            this.elem[i] = 0;
//        }
        this.usedSize = 0;
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的男女比例。 男女比例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Später321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值