当前位置: 首页 > news >正文

Re:从零开始的数据结构 1 顺序表

顺序表属于线性表的一种实现。

线性表 ADT

一般有这些:

  1. 求元素个数

  2. 插入

  3. 删除

  4. 查找

  5. 判断是否为空

根据这个我们设计一个抽象的线性表接口 :

/**
 * Author/Date: venjerLu / 2017/1/6 14:41
 * Email:       alwjlola@gmail.com
 * Description: 线性表抽象数据类型接口
 */

public interface MyList<T> {
  /**
   * 获得线性表的长度
   */
  int size();

  /**
   * 判断线性表是否为空
   */
  boolean isEmpty();

  /**
   * 在指定位置插入元素
   *
   * @param index 元素索引
   * @param obj 元素实例
   */
  void insert(int index, T obj) throws Exception;

  /**
   * 删除指定的元素
   *
   * @param index 元素的索引
   */
  void delete(int index) throws Exception;

  /**
   * 得到指定的元素
   *
   * @param index 元素的索引
   * @return Object
   */
  T get(int index) throws Exception;

  /**
   * 在最后一位插入
   * @param t 元素
   */
  void add(T t) throws Exception;
}
复制代码

顺序表的实现

**
 * Author/Date: venjerLu / 2017/1/6 14:48
 * Email:       alwjlola@gmail.com
 * Description: 顺序表的实现
 */

public class SequenceList<T> implements MyList<T> {
  private final int defaultSize = 10; // 默认顺序表的长度
  private int maxSize; // 最大长度
  private int size; // 当前长度
  private T[] elements; // 元素数组

  public SequenceList() {
    init(defaultSize);
  }

  public SequenceList(int maxSize) {
    init(maxSize);
  }

  /**
   * 初始化顺序表
   *
   * @param size 最大长度
   */
  @SuppressWarnings("unchecked") private void init(int size) {
    maxSize = size;
    this.size = 0;
    elements = (T[]) new Object[maxSize];
  }

  @Override public int size() {
    return size;
  }

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

  @Override public void insert(int index, T obj) throws Exception {
    if (size == maxSize) {
      // TODO: 2017/1/6 动态增加数组的大小
      throw new Exception("顺序表已满,无法插入");
    }
    if (index < 0 || index > size) {
      throw new Exception("index 非法");
    }

    // 从 index 开始所有的元素往后一位, 从表尾开始遍历
    for (int j = size - 1; j >= index; j++) {
      // 将前一个值赋值给后一位
      elements[j + 1] = elements[j];
    }
    elements[index] = obj;
    size++;
  }

  @Override public void delete(int index) throws Exception {

    if (isEmpty()) {
      throw new Exception("书序表为空,无法删除");
    }
    if (index < 0 || index > size) {
      throw new Exception("index 非法");
    }
    // 从 index 开始所有的元素往前移一位, 从表尾开始遍历
    for (int i = size - 1; i >= index; i++) {
      // 将后一个元素的值赋值给前一个元素。
      elements[i] = elements[i + 1];
    }
    elements[size - 1] = null; // 将最后一个元素值置为空。
    size--;
  }

  @Override public T get(int index) throws Exception {
    if (index < 0 || index > size) {
      throw new Exception("index 非法");
    }
    if (isEmpty()) {
      throw new Exception("list is null");
    }
    return elements[index];
  }

  @Override public void add(T t) throws Exception {
    if (size == maxSize) {
      // TODO: 2017/1/6 动态增加数组的大小
      throw new Exception("顺序表已满,无法插入");
    }
    elements[size] = t;
    size++;
  }
}
复制代码

相关文章:

  • 终端的实用命令行
  • Timer,Thread定时器用法
  • mycat分片规则之范围约定规则(auto-sharding-long)
  • 使Apache(Linux)支持Silverlight
  • Java IO详解
  • 循环打印视图(学习WHILE循环)
  • rsync同步的实现及其简单源码包的编译安装
  • css3新特性
  • 微信小程序 textarea
  • 从jQuery 入口方式写jQuery工具类库
  • SQL优化常用方法13
  • Maven打uber-jar,运行报读取不到dubbo.xsd的解决方案
  • PHP的引用,你知道多少
  • 06、python 系列之 函数
  • ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus
  • Django 博客开发教程 8 - 博客文章详情页
  • HomeBrew常规使用教程
  • Javascript设计模式学习之Observer(观察者)模式
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • vue-router的history模式发布配置
  • 反思总结然后整装待发
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 如何解决微信端直接跳WAP端
  • 王永庆:技术创新改变教育未来
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • linux 淘宝开源监控工具tsar
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)创业的注意事项
  • (转)原始图像数据和PDF中的图像数据
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .Net 路由处理厉害了
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @Repository 注解
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [Avalon] Avalon中的Conditional Formatting.
  • [AX]AX2012 SSRS报表Drill through action
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [CSS3备忘] transform animation 等
  • [CTO札记]如何测试用户接受度?
  • [IE9] 解决了傲游、搜狗浏览器在IE9下网页截图的问题
  • [Java][Android][Process] ProcessBuilder与Runtime差别
  • [LeetCode]剑指 Offer 40. 最小的k个数
  • [Linux] MySQL数据库之索引
  • [NOIP2005]过河
  • [one_demo_4]不使用第3个变量交换两个变量的值