[数据结构] 线性表和顺序表

devtools/2025/2/8 23:24:46/

目录

 线性表

顺序表的实现

顺序表各个方法的实现

boolean isFull() -- 判断数组是否放满 :

void add(int data) -- 在数组末尾插入新元素 : 

void add(int pos,int data) -- 在指定位置插入元素 : 

boolean contain(int toFind) -- 判断是否包含某个元素

int indexOf(int toFind) -- 查找某个对应元素的位置

int get(int pos) -- 获取pos位置的元素

void set(int pos,int value) -- 将pos位置的元素设为value

void remove (int toRemove)——删除第一次出现的关键字

void removeAll (int toRemove)——删除所有出现的关键字

void clear ()——清空顺序表


 线性表

线性表是n个具有相同特性的数据元素的有限序列.线性表是一种在实际中广泛应用的数据结构,常见的线性表: 顺序表, 链表, 栈, 队列...

线性表在逻辑上是线性结构,也就是说连续的一条直线.但是在物理结构上并不一定是连续的,线性表在屋里上存储时,通常以数组和链式结构的形式存储.

 

顺序表的实现

1. 创建一个IList 接口, 用来放所有相关方法

public interface IList {boolean isFull(); // 判断数组是否放满void add(int data); // 在数组末尾新增元素void add(int pos,int data); // 给指定位置插入数据boolean contain(int toFind); // 判断是否包含某个元素int indexOf(int toFind); // 查找某个对应元素的位置int get(int pos); // 获取pos位置的元素void set(int pos,int value);// 将pos位置的元素设为valuevoid remove(int toRemove); // 删除第一次出现的关键字void removeAll(int roRemove); // 删除所有出现的关键字void clear(); // 清空顺序表
}

2.创建一个MyArrayList 类, 数组成员变量 int[] elem 用来放数据, 整形成员变量usedSize 用来记录数组里面的数据个数

3.在 MyArrayList 类里面实现IList 接口, 并重写里面的方法

顺序表各个方法的实现

boolean isFull() -- 判断数组是否放满 :

直接返回usedSize == elem.length 即可,相等为true, 不等为false

public boolean isFull() {return size == elem.length;}

void add(int data) -- 在数组末尾插入新元素 : 

1.先用isFull()方法判断数组是否放满,若装满,就调用Arrays的copyOf(elem,2*elem.length)方法对数组进行扩容

2.将第usedSize位的数组元素赋值为data

3.usedSize++

public void add(int data) {if(isFull()) {elem = Arrays.copyOf(elem,elem.length * 2); // 如果满了就扩容为原来的两倍}elem[size] = data;size++;}

void add(int pos,int data) -- 在指定位置插入元素 : 

1.首先判断传入的参数pos是否合法:

                1).创建一个checkPosOfAdd(int pos)方法来进行判断

                2).若(pos < 0 || pos >= usedSize) ,则抛出一个自定义异常 PosNotLegalException

2.再用isFull()方法判断数组是否装满,若装满,调用Arrays的copyOf(elem,2*elem.length)方法对数组进行扩容

3.移动元素,将后面的元素从后往前依次向后移动一位elem[usedSize] = elem[usedSize - 1]

4.插入元素,elem[pos] = data

5.usedSize++

public void add(int pos, int data) {// 判断pos是否合法try {checkAddPos(pos);} catch (PosNotLegalException e) {e.printStackTrace();}// 判断数组是否放满if(isFull()) {elem = Arrays.copyOf(elem,2*elem.length);}// 移除元素for (int i = usedSize - 1;i >= pos;i--) {elem[i+1] = elem[i];}elem[pos] = data;usedSize++;}

void checkAddPos(int pos) -- 检查传入add方法中的pos是否合法 : 

                若不合法则抛出一个自定义异常 PosNotLegalException

private void checkAddPos(int pos) {if(pos < 0 || pos >= usedSize) {throw new PosNotLegalException("pos位置不合法");}}

PosNotLegalException -- 传入参数不合法的自定义异常

                继承自运行时异常 RuntimeException

public class PosNotLegalException extends RuntimeException{public PosNotLegalException(String msg) {super(msg);}
}

boolean contain(int toFind) -- 判断是否包含某个元素

1.遍历数组

2.当elem[i] == toFind 时, return true;

3.找不到,return false

public boolean contain(int toFind) {for (int i = 0;i < usedSize;i++) {if(elem[i] == toFind) {return true;}}return false;}

int indexOf(int toFind) -- 查找某个对应元素的位置

1.遍历数组

2.当elem[i] == toFind 时, return i;

3.找不到 return -1;

public int indexOf(int toFind) {for (int i = 0;i < usedSize;i++) {if(elem[i] == toFind) {return i;}}return -1;}

int get(int pos) -- 获取pos位置的元素

1.判断传入的参数pos是否合法

        1)创建 checkPosOfGetAndSet(int pos) 方法来进行判断

        2)若 (pos < 0 || pos >= usedSize) , 则抛出自定义异常 PosNotLegalException

2.合法, return elem[pos]

public int get(int pos) {try {checkPosOfGetAndSet(pos);} catch (PosNotLegalException e) {e.printStackTrace();}return elem[pos];}private void checkPosOfGetAndSet(int pos) {if(pos < 0 || pos >= usedSize) {throw new PosNotLegalException("pos位置不合法");}}

void set(int pos,int value) -- 将pos位置的元素设为value

1. 判断传入的参数pos是否合法

        1).调用checkPosOfGetAndSet(int pos) 方法来判断

        2).若 (pos < 0 || pos >= usedSize) , 则抛出自定义异常 PosNotLegalException

2.赋值: elem[pos] == value;

@Overridepublic void set(int pos, int value) {try {checkPosOfGetAndSet(pos);} catch (PosNotLegalException e) {e.printStackTrace();}elem[pos] = value;}
private void checkPosOfGetAndSet(int pos) {if(pos < 0 || pos >= usedSize) {throw new PosNotLegalException("pos位置不合法");}}

void remove (int toRemove)——删除第一次出现的关键字

1.调用 indexOf() 方法,获取关键字的下标,并对下标进行判断,若 pos == -1,则输出“未找到

2. 移动元素,将后面的元素从后往前依次向后移一位 elem[pos] = elem[pos + 1];

3.usedSize--;

public void remove(int toRemove) {int pos = indexOf(toRemove);if(pos == -1) {System.out.println("没有要找的关键字");return;}for(int i = pos;i < usedSize-1;i++) {elem[i] = elem[i+1];}usedSize--;}

void removeAll (int toRemove)——删除所有出现的关键字

  1. 使用 for 循环多次调用 indexOf() 方法,若 pos != -1,则继续操作
  2. 移动元素,将后面的元素从后往前依次向后移一位 `elem[pos] = elem[pos + 1];
  3. usedSize--;
public void removeAll(int toRemove) {for(int i = 0;i < usedSize;) {int pos = indexOf(toRemove);if(pos != -1) {for(int j = pos;j < usedSize - 1;j++) {elem[j] = elem[j+1];}usedSize--;} else {break;}}}

void clear ()——清空顺序表

  • 因为是基本类型,直接 usedSize = 0 即可
  • 若是引用类型,则需将每一个位置的数据都置为 null (防止内存泄露)
public void clear() {usedSize = 0;}


http://www.ppmy.cn/devtools/157201.html

相关文章

Android ExpandableListView 详细用法全解析

引言 在 Android 开发中&#xff0c;列表展示是一种非常常见的交互形式。而 ExpandableListView 作为一种特殊的列表控件&#xff0c;它允许我们创建具有分组功能的列表&#xff0c;每个分组下还可以包含多个子项&#xff0c;并且分组可以展开和收缩&#xff0c;这大大增强了数…

Vue混入(Mixins)与插件开发深度解析

Vue混入&#xff08;Mixins&#xff09;与插件开发深度解析 Vue混入&#xff08;Mixins&#xff09;与插件开发深度解析1. Vue混入&#xff08;Mixins&#xff09;核心概念1.1 什么是混入1.1.1 本质定义与技术定位1.1.2 混入与相关概念的对比1.1.3 适用场景分析1.1.4 设计哲学与…

Python Bug修复案例分析:列表切片引发的内存泄漏问题

在python程序中操作一个大型数据处理系统中&#xff0c;我们发现当程序运行一段时间后&#xff0c;内存占用不断增加&#xff0c;最终导致系统性能下降。经过分析&#xff0c;发现问题出在对大量数据进行列表切片操作时的内存管理上。我们来看看相关的 代码 class DataProcess…

profinet转ModbusTCP网关,助机器人“掀起”工业智能的惊涛骇浪

在现代汽车制造过程中&#xff0c;生产设备的精确控制与实时监测是确保产品质量和生产效率的关键。某汽车制造厂在其生产线上应用了可编程逻辑控制器&#xff08;PLC&#xff09;和压力传感器&#xff0c;这两种设备分别使用稳联技术Profinet和ModbusTCP协议&#xff08; WL-A…

2021 年 9 月青少年软编等考 C 语言五级真题解析

目录 T1. 问题求解思路分析T2. 抓牛思路分析T3. 交易市场思路分析T4. 泳池思路分析T1. 问题求解 给定一个正整数 N N N,求最小的 M M M 满足比 N N N 大且 M M M 与 N N N 的二进制表示中有相同数目的 1 1 1。 举个例子,假如给定 N N N 为 78 78 78,二进制表示为 …

【MySQL】centos 7 忘记数据库密码

vim /etc/my.cnf文件&#xff1b; 在[mysqld]后添加skip-grant-tables&#xff08;登录时跳过权限检查&#xff09; 重启MySQL服务&#xff1a;sudo systemctl restart mysqld 登录mysql&#xff0c;输入mysql –uroot –p&#xff1b;直接回车&#xff08;Enter&#xff09; 输…

Elasticsearch 高级技巧

Elasticsearch 高级技巧 1. 优化查询 使用过滤器&#xff08;Filter&#xff09;而不是查询&#xff08;Query&#xff09; Elasticsearch 中的查询分为两种主要类型&#xff1a;查询&#xff08;Query&#xff09; 和 过滤器&#xff08;Filter&#xff09;。查询会计算文档…

分享2款 .NET 开源且强大的翻译工具

前言 对于程序员而言永远都无法逃避和英文打交道&#xff0c;今天大姚给大家分享2款 .NET 开源、功能强大的翻译工具&#xff0c;希望可以帮助到有需要的同学。 STranslate STranslate是一款由WPF开源的、免费的&#xff08;MIT License&#xff09;、即开即用、即用即走的翻…