首页 > 其他分享 >【数据结构】:顺序表里一些主要功能的实现

【数据结构】:顺序表里一些主要功能的实现

时间:2024-07-27 09:53:33浏览次数:13  
标签:顺序 int void usedSize elem pos PosNotLegalException 表里 数据结构

框架

image.png


线性表


  • n 个具有相同特征的数据元素的有限序列
    常见的线性表:顺序表、链表、栈、队列…

  • 线性表在逻辑上是线性结构,也就是连续的一条直线
    但在物理结构上不一定是连续的,线性表在物理上存储时,通常以数组链式结构的形式进行存储
    image.png|581

顺序表

  • 顺序表其实就是一个数组,是用一段物理地址连续的存储单元依次存储数据元素的线性结构
  • 其访问速度比较快,给定下标情况下,速度为 O (1)
  • 适用于经常进行下标查找或者更新的操作

顺序表实现逻辑

  1. 创建一个 IList 接口,用来放所有相关的方法
  2. 创建一个 MyArrayList 类,数组成员变量 int[ ] elem 用来放数据,整形成员变量 usedSize 用来记录数组里面的数据个数
  3. MyArrayList 类里面实现 IList 接口,并重写里面的方法

各种方法的实现

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

  • 直接返回 usedSize == elem.length 即可,相等为 true,不相等为 false
    @Override
    public boolean isFull() {
        return usedSize == elem.length;
    }

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

  1. 首先用 isFUll() 方法判断数组是否装满,若装满,就调用 ArrayscopyOf(elem, 2*elem.length) 方法对数组进行扩容
  2. 将第 usedSize 位的数组元素赋值为 data
  3. usedSize++;
    @Override
    public void add(int data) {
        if(isFull()){
            //如果满了,就扩容为原来的两倍
            elem = Arrays.copyOf(elem,elem.length*2);
        }
        elem[usedSize] = data;
        usedSize++;
    }

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

  1. 首先判断传入的参数 pos 是否合法
    • 我们创建一个 checkPosOfAdd(int pos) 方法来进行判断,
    • (pos < 0 || pos >= usedSize) ,则抛出一个自定义异常 PosNotLegalException
  2. 再用 isFull() 方法判断数组是否装满,若装满,就调用 ArrayscopyOf(elem, 2*elem.length) 方法对数组进行扩容
  3. 移动元素,将后面的元素从后往前依次向后移一位 elem[usedSize] = elem[usedSize - 1];
  4. 插入元素,elem[pos] = data;
  5. usedSize++;
    @Override
    public void add(int pos, int data) {
        //判断输入的 pos 是否合法
        try{
            checkAddPos(pos);
        }catch (PosNotLegalException e){
            e.printStackTrace();
        }
        //判断数组是否装满
        if(isFull()){
            elem = Arrays.copyOf(elem,elem.length*2);
        }
        //移动元素
        for (int i = usedSize - 1; i >= pos; i--) {
            elem[i + 1] = elem[i];
        }
        //插入元素
        elem[pos] = data;
        usedSize++;
    }
void checkPosOfAdd (int pos)——检查传入 add 方法中的 pos 是否合法
  • 若不合法则抛出一个自定义异常 PosNotLegalException
private void checkPosOfAdd(int pos) throws PosNotLegalException{  
    if(pos < 0 || pos > usedSize){  
        //自定义一个异常类:PosNotLegalException  
        throw new PosNotLegalException("pos位置不合法");    
    }
}

PosNotLegalException——传入参数不合法的自定义异常
  • 继承自运行时异常 RuntimeException
public class PosNotLegalException extends RuntimeException{  
    public PosNotLegalException(String msg) {  
        super(msg);  
    }
}

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

  1. 遍历数组 usedSize 次
  2. elem[i] == toFind 时,return true;
  3. 找不到,return false;
public boolean contains(int toFind) {  
    //只需要寻找useSize次  
    for (int i = 0; i < usedSize; i++) {  
        if(elem[i]==toFind){  
            return true;  
        }    
    }   
    return false;  
}

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

  1. 遍历数组 usedSize
  2. elem[i] == toFind 时,return i;
  3. 找不到,return 0;
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 是否合法
    • 创建 checkPosOfGetAndSet(int pos) 方法来进行判断
    • (pos < 0 || pos > usedSize),则抛出自定义异常 PosNotLegalException
  2. 合法,return elem[pos];
public int get(int pos) {  
    try{  
        checkPosOfGet(pos);  
    }catch (PosNotLegalException e){  
        e.printStackTrace();  
    }    return elem[pos];  
}  

void checkPosOfGetAndSet (int pos)——判断输入 get 和 set 方法的值是否合法
  • 若不合法则抛出一个自定义异常 PosNotLegalException
private void checkPosOfGet (int pos) throws PosNotLegalException{  
    if(pos < 0 || pos > usedSize){  
        throw new PosNotLegalException("pos位置不合法");  
    }
}

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

  1. 判断传入的参数 pos 是否合法
    • 调用 checkPosOfGetAndSet(int pos) 方法来进行判断
    • (pos < 0 || pos > usedSize),则抛出自定义异常 PosNotLegalException
  2. 赋值:elem[pos] == value;
public void set(int pos, int value) {  
    try {  
        checkPosOfGetAndSet(pos);  
    } catch (PosNotLegalException e) {  
        e.printStackTrace();  
    }    
    elem[pos] = value;  
}

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("没有要找的关键字");  
    }    for (int i = pos; i < usedSize - 1; i++) {  
        elem[i] = elem[ i + 1];  
    }    this.usedSize--;  
}

void removeAll (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; i++) {  
        int pos = indexOf(toRemove);  
        if (pos != -1) {  
            for (int j = pos; j < usedSize - 1; j++) {  
                elem[j] = elem[j + 1];  
            }            
            usedSize--;  
        }    
    }
}

void clear ()——清空顺序表

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

标签:顺序,int,void,usedSize,elem,pos,PosNotLegalException,表里,数据结构
From: https://blog.csdn.net/Yeeear/article/details/140730868

相关文章

  • 数据结构(Java):HashMap源码解析【JDK17】
    1、整体总结 2、成员属性table哈希数组DEFAULT_INITIAL_CAPACITY哈希表默认容量值(16)MAXIMUM_CAPACITY最大容量值DEFAULT_LOAD_FACTOR默认负载因子threshold当前存放元素数量达到该值时就会触发数组扩容TREEIFY_THRESHOLD树化条件之一(转化为红黑树的阈值)MIN_......
  • 数据结构day4(栈)
    seqstack系统中的栈是在缓存区上  数据结构中的栈在堆上  ========================1、空增栈2、空减栈3、满增栈4、满减栈  空栈,top指示器,表示的是新元素待插入的位置满栈,top指示器指的是,最后压栈的元素的位置顺序栈的基本操作:#include"seqstack.h"......
  • MySQL数据结构和索引
    一、MySQL数据结构InnoDB引擎MySQL默认引擎是InnoDB引擎,这个引擎的主要特点是支持事务和行锁,数据结构2.1二叉树(二叉查找树)二叉树是一种特殊的树,二叉树中每个节点的度都不能大于2,就是说每个节点最多只能有左右两个子节点当我们像二叉查找树储存数据的时候,是安装从大到小(或......
  • 顺序表的实现和操作
    目录一.前言二.顺序表的优缺点三.顺序表的定义和初始化四.顺序表的相关操作一.前言    首先介绍下线性表的定义,线性表是具有相同特性的数据元素的一个有限序列。而我们的顺序表就是线性表的一种,是线性表的顺序存储结构。所谓顺序存储就是把逻辑上相邻的数据......
  • 可持久化数据结构
    可持久化数据结构简介分类部分可持久化所有版本都可以访问,但是只有最新版本可以修改。完全可持久化所有版本都既可以访问又可以修改。实际应用几何计算(扫描线),字串处理(合并操作rope),版本回溯,函数式编程。可持久化线段树引入[P3834【模板】可持久化线段树2]首先考虑静态......
  • 数据结构 二叉树 前 中 后 序列
    简单二叉树的遍历如果看完还是不太懂就观看速成视频https://www.bilibili.com/video/BV1Ub4y147Zv/?spm_id_from=333.337.search-card.all.click&vd_source=e5f8765d50fb89ef04eb150bd76075b5引用资料文献链接放到篇尾简单术语解释节点(Node):二叉树中的一个元素,包含值和......
  • 【数据结构与算法】快速排序万字全攻略:hoare版本、挖坑法、前后指针法、优化版、非递
          ......
  • 软考-软件设计师(3)-数据结构与算法:树、图、队列、查找算法、排序算法、霍夫曼编码/
    场景软考-软件设计师-数据结构与算法模块高频考点整理。以下为高频考点、知识点汇总,不代表该模块所有知识点覆盖,请以官方教程提纲为准。注:博客:霸道流氓气质-CSDN博客实现知识点树:节点的度、树的度、深度、高度、满二叉树、完全二叉树、平衡二叉树、B树、二叉排序树节点......
  • 算法与数据结构 -随笔
    1.LinkedList1)Buildthelist2)Sortthelist3)Lookupsomeiteminthelist4)Insertionanddeletioninthelist5) Reversethelist6)JousephproblemWeshouldn'tlimitourselvestoonlymoveonesinglestepbyusing......
  • 【数据结构】单链表的增删改查
    介绍链表是有序的列表,但是它在内存中是如下存储的:①链表以节点的方式进行存储,是链式存储的②每个节点包含data域、next域:指向下一节点③链表的各个节点不一定是连续存放的④链表分为有头节点的链表和没有头节点的链表 head节点1.不存放具体数据2.作用就是表示......