• 浅谈顺序表基本操作


    🤷‍♀️🤷‍♀️🤷‍♀️ 今天给大家带来的是数据结构——顺序表的实现(增删查改)。 

    清风的CSDN博客主页

    🎉欢迎👍点赞✍评论❤️收藏

    😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!

    动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛

    目录

     一、顺序表的构造函数

    1.1接口

    1.2 类定义

    二、实现的功能

    2.1检查容量

     2.2表尾插入元素

    2.3判满

    2.4指定位置增加元素

    2.5判空

    2.6检查数据是否在表中

    2.7查找指定元素的下标

    2.8获取指定位置的元素

    2.9设置表中指定位置的元素

    2.10删除元素

    2.11获取元素个数

    2.12清空顺序表

    2.13显示顺序表


    源码链接-清风的Gitee

     一、顺序表的构造函数

    1.1接口

    1. public interface IList {
    2. // 新增元素,默认在数组最后新增
    3. void add(int data);
    4. // 在 pos 位置新增元素
    5. void add(int pos, int data);
    6. // 判定是否包含某个元素
    7. boolean contains(int toFind);
    8. // 查找某个元素对应的位置
    9. int indexOf(int toFind);
    10. // 获取 pos 位置的元素
    11. int get(int pos);
    12. // 给 pos 位置的元素设为 value
    13. void set(int pos, int value);
    14. //删除第一次出现的关键字key,更新
    15. void remove(int toRemove);
    16. // 获取顺序表长度
    17. int size();
    18. // 清空顺序表
    19. void clear();
    20. // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    21. void display();
    22. //顺序表判满
    23. boolean isFull();
    24. //顺序表判空
    25. boolean isEmpty();
    26. }

    1.2 类定义

    1. class MyArrayList implements IList {
    2. private int[] elem;
    3. private int usedSize;
    4. public static final int DEFAULT_SIZE=2;
    5. public MyArrayList(){
    6. this.elem=new int[DEFAULT_SIZE];
    7. this.usedSize=0;
    8. }
    9. public MyArrayList(int capacity){
    10. this.elem=new int[capacity];
    11. }
    12. }

    二、实现的功能

    2.1检查容量

    如果当前容量不足,则扩大2倍。

    1. private void checkCapacity(){//检查容量
    2. if(isFull()){
    3. //扩容
    4. elem=Arrays.copyOf(elem,elem.length*2);
    5. }
    6. }

     2.2表尾插入元素

    在插入前,首先检查容量,容量不足就先扩容,之后继续插入。

    1. public void add(int data) {
    2. checkCapacity();
    3. elem[this.usedSize]=data;
    4. this.usedSize++;
    5. }

    2.3判满

    1. public boolean isFull() {
    2. /* if(usedSize==elem.length){
    3. return true;
    4. }
    5. return false;*/
    6. return usedSize==elem.length;
    7. }

    2.4指定位置增加元素

    首先要检查指定位置是否合法:

    1. private void checkPosOnAdd(int pos) throws PosIllegality{
    2. if(pos<0 || pos>usedSize){
    3. System.out.println("插入不合法!");
    4. throw new PosIllegality("插入元素下标异常:>"+pos);
    5. }
    6. }
    1. public void add(int pos, int data) {
    2. try{
    3. checkPosOnAdd(pos);//检查pos位置合法性
    4. }catch (PosIllegality e){
    5. e.printStackTrace();//捕获异常并打印插入元素下标异常
    6. return;
    7. }
    8. checkCapacity();
    9. //1.从最后一个有效的数据开始往后移动,当i小于pos就结束
    10. for (int i = usedSize-1; i >=pos ; i--) {
    11. elem[i+1]=elem[i];
    12. }
    13. //2.存放元素到pos位置
    14. elem[pos]=data;
    15. //3.顺序表长度加一
    16. usedSize++;
    17. }

    2.5判空

    1. public boolean isEmpty() {
    2. return usedSize==0;
    3. }

    2.6检查数据是否在表中

    1. public boolean contains(int toFind) {
    2. if(isEmpty()){
    3. return false;
    4. }
    5. for (int i = 0; i < usedSize; i++) {
    6. //如果是查找引用类型,一定要用equals方法!!!
    7. if(elem[i]==toFind){
    8. return true;
    9. }
    10. }
    11. return false;
    12. }

    2.7查找指定元素的下标

    1. public int indexOf(int toFind) {
    2. if(isEmpty()){
    3. return -1;
    4. }
    5. for (int i = 0; i < usedSize; i++) {
    6. //如果是查找引用类型,一定要用equals方法!!!
    7. if(elem[i]==toFind){
    8. return i;
    9. }
    10. }
    11. return -1;
    12. }

    2.8获取指定位置的元素

    同样需要检查指定位置是否合法:

    1. private void checkPosOnGetAndSet(int pos) throws PosIllegality{
    2. if(pos<0 || pos>=usedSize){
    3. System.out.println("获取元素下标不合法!");
    4. throw new PosIllegality("获取元素下标异常:>"+pos);
    5. }
    6. }
    1. public int get(int pos)throws MyArrayListEmpty {
    2. if(isEmpty()){
    3. throw new MyArrayListEmpty("顺序表为空!!");
    4. }
    5. checkPosOnGetAndSet(pos);
    6. return elem[pos];
    7. }

    2.9设置表中指定位置的元素

    1. public void set(int pos, int value) {
    2. checkPosOnGetAndSet(pos);
    3. elem[pos]=value;
    4. }

    2.10删除元素

    删除元素,首先要找到要删除元素的下标,可以调用上面写过的函数。

    1. public void remove(int toRemove) {
    2. /**
    3. * 1.找到删除的数字下标
    4. * 2.挪动数据
    5. * 3.usedSize--
    6. */
    7. int index=indexOf(toRemove);
    8. if(index==-1){
    9. System.out.println("无此元素:>"+toRemove);
    10. return;
    11. }
    12. for (int i = index; i < usedSize-1; i++) {
    13. elem[i]=elem[i+1];
    14. }
    15. usedSize--;
    16. }

    2.11获取元素个数

    1. public int size() {
    2. return this.usedSize;
    3. }

    2.12清空顺序表

    1. public void clear() {
    2. this.usedSize=0;
    3. //如果是引用数据类型的清空,通过for循环把元素置空即可
    4. }

    2.13显示顺序表

    1. public void display() {
    2. for (int i = 0; i < this.usedSize; i++) {
    3. System.out.println(elem[i]+" ");
    4. }
    5. System.out.println();
    6. }

    🎉好啦,今天的分享就到这里!!

    ✨创作不易,还希望各位大佬支持一下!

    👍点赞,你的认可是我创作的动力!

    ⭐收藏,你的青睐是我努力的方向!

    ✏️评论:你的意见是我进步的财富!

  • 相关阅读:
    纯前端模板文件下载如何精确控制下载的文件名字
    有效沟通是情绪管理
    RabbitMQ必会的8个知识点
    美化mac系统自带的Terminal.app工具
    看板任务管理,让你分分钟提高工作效率!
    硬件混音 饱和失真问题 网页资料
    身份和访问管理IAM能力之RADIUS认证
    MyBatis-Plus--在xml中使用wrapper的方法
    MidJourney笔记(1)-入门
    使用小程序实现左侧菜单,右侧列表双向联动效果
  • 原文地址:https://blog.csdn.net/m0_73920844/article/details/134295501