java - 数据结构,顺序表
创始人
2024-03-08 12:19:16
0

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(){//构造方法,初始化数组的大小为10this.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;//有效数据+1usedSize++;}//判断数组是否满了,如果满了返回true,没有满返回falsepublic 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;}
查找某个元素对应的位置
 // 查找某个元素对应的位置,找到返回该元素下标,没找到返回-1public 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 位置的元素设为 valuepublic void setPos(int pos, int value) {if(pos < 0 || pos > this.usedSize){System.out.println("pos位置不合法!");return;}this.elem[pos] = value;}
删除第一次出现的关键字
// 查找某个元素对应的位置,找到返回该元素下标,没找到返回-1public int search(int toFind) {for(int i = 0; i < this.usedSize; i++){if(elem[i] == toFind){return i;}}return -1;}//删除第一次出现的关键字keypublic 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(){//构造方法,初始化数组的大小为10this.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;//有效数据+1usedSize++;}//判断数组是否满了,如果满了返回true,没有满返回falsepublic 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 位置的元素设为 valuepublic void setPos(int pos, int value) {if(pos < 0 || pos > this.usedSize){System.out.println("pos位置不合法!");return;}this.elem[pos] = value;}// 查找某个元素对应的位置,找到返回该元素下标,没找到返回-1public int search(int toFind) {for(int i = 0; i < this.usedSize; i++){if(elem[i] == toFind){return i;}}return -1;}//删除第一次出现的关键字keypublic 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;}
}

相关内容

热门资讯

铸法治之魂 优营商之境 聚发展... 营商环境是区域发展的核心竞争力,也是激发市场主体活力的关键所在。 2025年12月3日,《毕节市优化...
“惠民政策落不到村”,紧抓! “重点研究周武村党组织软弱涣散的问题,大家直奔主题,谈谈看法。”山西长治市潞城区店上镇会议室里,一场...
《南阳市中医药产业发展促进条例... 河南日报客户端记者 曾倩 12月26日,南阳市政府新闻办公室召开《南阳市中医药产业发展促进条例》(以...
资讯|蓝天彬律师应邀参加研讨会... 2025年12月27日,由北京市海淀区律师协会、北京市西城区律师协会、南京市律师协会联合主办,北京市...
河北一男子称因挪车问题,与一女... 据媒体报道,12月27日,河北衡水龙先生称一女司机以车辆被挡为由,要求他挪车,随后两人因此产生纠纷,...
天津一律师简介宣传爱人是“市局... 12月28日,天津一名刑辩何姓律师的社交平台账号在介绍中称自己是“警嫂”,“爱人是市局经侦办案警官”...
教育部:学籍变动管理实行“一人... 北京商报讯(记者 关子辰 牛清妍)12月29日,记者从教育部官网获悉,《全国学前儿童学籍管理办法(试...
共逐封关政策红利 全球闽商海南... 中新网海口12月29日电 (记者 符宇群)“此行我想了解更多海南封关运作后的相关政策导向,并引导大湾...
国资委:研究制定国有企业履行战... 12月29日,国务院国资委主任张玉卓在学习时报发文表示,党的二十届三中全会明确的各项改革任务需要在2...