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++;
  }
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值