数据结构:线性表的实现

news/2024/11/25 17:48:34/

  • 静态数组与动态数组
  • 线性表的定义
  • List接口的定义
  • ArrayList及其方法的实现
    • 属性
    • 构造器
    • 把数组转换为线性表的方法
    • 判断是否需要扩容和缩容问题
    • 添加元素的方法
    • 删除元素的方法
    • 修改元素的值
    • 获取元素的值
    • 获取线性表元素个数
    • 获取线性表中数组容量
    • 获取元素在线性表下标
    • 判断是否包含某个元素
    • 判断线性表是否为空
    • 清空线性表
    • 返回子线性表
    • 判断两个线性表是否相等
    • 打印线性表的不同方式
  • 测试

📃个人主页:不断前进的皮卡丘
🌞博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记
🔥网站推荐:千里之行,始于足下。每天坚持刷题,巩固所学知识,也为将来找工作,面试做好准备-----刷题神器

静态数组与动态数组

在这里插入图片描述

在这里插入图片描述

增删元素的话,线性结构要保证元素的连续性
在这里插入图片描述

动态数组是顺序存储结构具体实现的核心思想
在这里插入图片描述

线性表的定义

在这里插入图片描述

  • a1是a2的直接前驱
  • a2是a1的直接后继
  • 除了第一个元素a1以外,其他元素都有唯一的直接前驱
  • 除了最后一个元素an以外,其他元素都有唯一的直接后继
  • n表示线性表的长度,当n=0,称为空表

List接口的定义

因为线性结构可以有顺序存储结构和链式存储结构实现,那么我i吗就可以把对线性结构的共同操作进行抽取,定义出线性结构的接口
在这里插入图片描述

public interface List <E> extends Iterable<E>{public void add(E element);public void add(int index,E element);public void remove(E element);public E remove(int index);public E set(int index,E element);public E get(int index);//获取元素个数public int size();public int indexOf(E  element);public boolean contains(E element);public boolean isEmpty();public void clear();/*** 根据比较器定义的比较规则来进行比较大小*/public void sort(Comparator<E> c);public List<E> subList(int fromIndex,int toIndex);
}

ArrayList及其方法的实现

属性

在这里插入图片描述

构造器

在这里插入图片描述

把数组转换为线性表的方法

在这里插入图片描述

判断是否需要扩容和缩容问题

扩容
在这里插入图片描述
缩容
在这里插入图片描述

添加元素的方法

在这里插入图片描述

删除元素的方法

在这里插入图片描述

修改元素的值

    @Overridepublic E set(int index, E element) {if (index < 0 || index >= size) {throw new IllegalArgumentException("set index out of bounds");}E old = data[index];data[index] = element;return old;}

获取元素的值

   @Overridepublic E get(int index) {if (index < 0 || index >= size) {throw new IllegalArgumentException("get index out of bounds");}return data[index];}

获取线性表元素个数

    @Overridepublic int size() {return size;}

获取线性表中数组容量

  public int getCapacity() {return data.length;}

获取元素在线性表下标

  @Overridepublic int indexOf(E element) {for (int i = 0; i < size; i++) {if (element.equals(data[i])) {return i;}}return -1;}

判断是否包含某个元素

  @Overridepublic boolean contains(E element) {return indexOf(element) != -1;}

判断线性表是否为空

    @Overridepublic boolean isEmpty() {return size == 0;}

清空线性表

  @Overridepublic void clear() {for (int i = 0; i < data.length; i++) {data[i] = null;}size = 0;}

返回子线性表

 /*** [formIndex,toIndex]* 要判断索引是否有效* 根据索引,来返回子线性表** @param fromIndex* @param toIndex* @return*/@Overridepublic List<E> subList(int fromIndex, int toIndex) {if (fromIndex < 0 || fromIndex >= size) {throw new IllegalArgumentException("角标越界");}if (toIndex < 0 || toIndex >= size) {throw new IllegalArgumentException("角标越界");}if (fromIndex > toIndex) {throw new IllegalArgumentException("角标越界");}ArrayList<E> subList = new ArrayList<>();for (int i = fromIndex; i < toIndex; i++) {subList.add(data[i]);}return subList;}

判断两个线性表是否相等

在这里插入图片描述

打印线性表的不同方式

    @Overridepublic String toString() {StringBuilder builder = new StringBuilder(String.format("ArrayList:%d/%d[", size, data.length));if (isEmpty()) {builder.append("]");//ArrayList:0/10;} else {for (int i = 0; i < size; i++) {builder.append(data[i]);if (i != size - 1) {builder.append(",");} else {builder.append("]");}}}return builder.toString();}/*** 获取ArrayList的迭代器,foreach遍历线性表it.hasNext(),it.next()来遍历** @return*/@Overridepublic Iterator<E> iterator() {return new ArrayListIterator();}class ArrayListIterator implements Iterator<E>{/*** 判断之后是否有元素* @return*/private int cur=0;@Overridepublic boolean hasNext() {return cur<size;}/*** 如果后面一个元素存在,则先把元素返回再把指针后移* @return*/@Overridepublic E next() {return data[cur++];}}

测试

在这里插入图片描述


http://www.ppmy.cn/news/606282.html

相关文章

RISC-V技术与展望

RISC-V技术与展望 RISC-V&#xff08;发音为“risk-five”&#xff09;是一个基于精简指令集&#xff08;RISC&#xff09;原则的开源指令集架构&#xff08;ISA&#xff09;。 与大多数指令集相比&#xff0c;RISC-V指令集可以自由地用于任何目的&#xff0c;允许任何人设计、…

LeetCode简单题之赎金信

题目 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输入&am…

vtk创建点

使用vtk库创建三维空间中的点 引言开发环境示例一项目结构实现代码 运行效果示例二项目结构实现代码 运行效果总结 引言 本文仅适合初学者。 本文不提供vtk动态库的生成&#xff0c;以及在QtCreator中的引进vtk时的配置。 本文先由示例一开始&#xff0c;然后再在示例一的基础…

独家 | TensorFlow 2.0将把Eager Execution变为默认执行模式,你该转向动态计算图了...

机器之心报道 作者&#xff1a;邱陆陆 8 月中旬&#xff0c;谷歌大脑成员 Martin Wicke 在一封公开邮件中宣布&#xff0c;新版本开源框架——TensorFlow 2.0 预览版将在年底之前正式发布。今日&#xff0c;在上海谷歌开发者大会上&#xff0c;机器之心独家了解到一个重大的改变…

数据结构:栈及其应用

栈的初步认识栈的设计Stack接口ArrayStack类(栈的顺序存储具体实现)十进制和十六进制的互相转换十进制转为十六进制十六进制转为十进制判断回文有效的括号逆波兰表达式求值栈的初步认识 栈的设计 Stack接口 因为栈可以用顺序存储实现也可以用链式存储实现&#xff0c;所以把共…

LeetCode简单题之反转字符串

题目 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1&#xff1a; 输入&#xff1a;s [“h”,“e”,“l”,…

pytorch nn.Embedding

pytorch nn.Embeddingclass torch.nn.Embedding(num_embeddings, embedding_dim, padding_idxNone, max_normNone, norm_type2, scale_grad_by_freqFalse, sparseFalse) num_embeddings (int) - 嵌入字典的大小 embedding_dim (int) - 每个嵌入向量的大小 padding_idx (int, op…

LeetCode简单题之Fizz Buzz

题目 给你一个整数 n &#xff0c;找出从 1 到 n 各个整数的 Fizz Buzz 表示&#xff0c;并用字符串数组 answer&#xff08;下标从 1 开始&#xff09;返回结果&#xff0c;其中&#xff1a; answer[i] “FizzBuzz” 如果 i 同时是 3 和 5 的倍数。 answer[i] “Fizz” 如果…