• 1、线性表实现:顺序存储


    抽象数据模型ADT:

     1 package ren.laughing.datastructure.base;
     2 
     3 import ren.laughing.datastructure.exception.OutOfBoundaryException;
     4 /**
     5 * 线性表ADT(抽象数据模型)
     6 * ADT包括数据数据元素,数据关系以及相关的操作。
     7 * 即ADT
     8 * {
     9 * 数据对象:(数据元素集合)
    10 * 数据关系:(数据关系二元组结合)
    11 * 基本操作:(操作函数的罗列)
    12 * }
    13 * @author Laughing
    14 * @time 2016年4月5日
    15 */
    16 public interface List {
    17 //返回线性表的大小,即数据元素的个数。
    18 public int getSize();
    19 //如果线性表为空返回 true,否则返回 false。
    20 public boolean isEmpty();
    21 //判断线性表是否包含数据元素 e
    22 public boolean contains(Object e);
    23 //返回数据元素 e 在线性表中的序号
    24 public int indexOf(Object e);
    25 //将数据元素 e 插入到线性表中 i 号位置
    26 public void insert(int i, Object e) throws OutOfBoundaryException;
    27 //将数据元素 e 插入到元素 obj 之前
    28 public boolean insertBefore(Object obj, Object e);
    29 //将数据元素 e 插入到元素 obj 之后
    30 public boolean insertAfter(Object obj, Object e);
    31 //删除线性表中序号为 i 的元素,并返回之
    32 public Object remove(int i) throws OutOfBoundaryException;
    33 //删除线性表中第一个与 e 相同的元素
    34 public boolean remove(Object e);
    35 //替换线性表中序号为 i 的数据元素为 e,返回原数据元素
    36 public Object replace(int i, Object e) throws OutOfBoundaryException;
    37 //返回线性表中序号为 i 的数据元素
    38 public Object get(int i) throws OutOfBoundaryException;
    39 }

    数据元素的比较策略:

     1 package ren.laughing.datastructure.base;
     2 /**
     3  * 数据元素的比较策略
     4  * @author Laughing
     5  * @time 2016年4月5日
     6  */
     7 public interface Strategy {
     8  //判断两个数据是否相等
     9  public boolean equal(Object obj1,Object obj2);
    10  //判断两个数据大小,返回-1|0|1
    11  public int compare(Object obj1,Object obj2);
    12 }

    线性表的实现:顺序存储结构

      1 package ren.laughing.datastructure.baseImpl;
      2 
      3 import ren.laughing.datastructure.base.List;
      4 import ren.laughing.datastructure.base.Strategy;
      5 import ren.laughing.datastructure.exception.OutOfBoundaryException;
      6 /**
      7  * 线性表的实现
      8  * @author Laughing
      9  * @time 2016年4月5日
     10  */
     11 public class ArrayList implements List{
     12  private final int LEN = 8; //默认数组大小8
     13  private Strategy strategy; //数据元素的比较策略
     14  private int size; //线性表中数据元素的个数
     15  private Object[] elements; //数据元素数组
     16  //构造器
     17  public ArrayList() {
     18  this(new DefaultStrategy());
     19  }
     20  public ArrayList(Strategy strategy) {
     21  this.strategy = strategy;
     22  size = 0;
     23  elements = new Object[LEN];//默认数组大小
     24  }
     25 
     26 
     27  @Override
     28  public int getSize() {
     29  return size;
     30  }
     31 
     32  @Override
     33  public boolean isEmpty() {
     34  if(size == 0){
     35  return true;
     36  }else{
     37  return false;
     38  }
     39  }
     40 
     41  @Override
     42  public boolean contains(Object e) {
     43  for(int i=0;i<size;i++){
     44  if(strategy.equal(e, elements[i])){
     45  return true;
     46  }
     47  }
     48  return false;
     49  }
     50 
     51  @Override
     52  public int indexOf(Object e) {
     53  for(int i=0;i<size;i++){
     54  if(strategy.equal(e, elements[i])){
     55  return i;
     56  }
     57  }
     58  return -1;
     59  }
     60 
     61  @Override
     62  public void insert(int i, Object e) throws OutOfBoundaryException {
     63  if (i < 0 || i > size) {
     64  throw new OutOfBoundaryException("错误,指定的插入序号越界。");
     65  }
     66  //若数据元素个数大于数据元素数组长度
     67  if (size >= elements.length) {
     68  expandSpace();// 扩充数组长度
     69  }
     70  for (int j = size; j > i; j--) {
     71  elements[j] = elements[j - 1];
     72  }
     73  elements[i] = e;
     74  size++;
     75 
     76  }
     77  //将数据元素 e 插入到元素 obj之前
     78  @Override
     79  public boolean insertBefore(Object obj, Object e) {
     80  int index = this.indexOf(obj);
     81  if(index < 0){
     82  return false;
     83  }else{
     84  this.insert(index, e);
     85  return true;
     86  }
     87  }
     88  //将数据元素 e 插入到元素 obj之后
     89  @Override
     90  public boolean insertAfter(Object obj, Object e) {
     91  int index = this.indexOf(obj);
     92  if(index < 0){
     93  return false;
     94  }else{
     95  this.insert(index+1, e);
     96  return true;
     97  }
     98  }
     99  //删除线性表中序号为 i 的元素,并返回之
    100  @Override
    101  public Object remove(int i) throws OutOfBoundaryException {
    102  if(i>=size||i<0){
    103  throw new OutOfBoundaryException("指定的删除序号越界");
    104  }
    105  Object obj = elements[i];
    106  for(int j=i;j<size;j++){
    107  elements[j]=elements[j+1];
    108  }
    109  elements[size--]=null;//释放数组最后一个位置的元素
    110  return obj;
    111  }
    112  //删除线性表中第一个与 e 相同的元素
    113  @Override
    114  public boolean remove(Object e) {
    115  int index = indexOf(e);
    116  if(index<0){
    117  return false;
    118  }else{
    119  this.remove(index);
    120  return true;
    121  }
    122  }
    123  //替换线性表中序号为 i 的数据元素为 e,返回原数据元素
    124  @Override
    125  public Object replace(int i, Object e) throws OutOfBoundaryException {
    126  if(i<0||i>=size){
    127  throw new OutOfBoundaryException("要替换元素的序号越界");
    128  }
    129  Object obj = elements[i];
    130  elements[i] = e;
    131  return obj;
    132  }
    133  //返回线性表中序号为 i 的数据元素
    134  @Override
    135  public Object get(int i) throws OutOfBoundaryException {
    136  if(i<0||i>=size){
    137  throw new OutOfBoundaryException("要获取元素的序号越界");
    138  }
    139  Object obj = elements[i];
    140  return obj;
    141  }
    142  /**
    143  * 扩充数组长度
    144  */
    145  private void expandSpace() {
    146  Object[] a = new Object[elements.length * 2];
    147  for (int i = 0; i < elements.length; i++)
    148  a[i] = elements[i];
    149  elements = a;
    150  }
    151  
    152 }
    —————————————————————————————————————行走在人猿的并行线——Laughing_Lz
  • 相关阅读:
    日常学习随笔-数组、单链表、双链表三种形式实现队列结构的基本操作(源码注释)
    代码重构之单元测试
    C# yield return 用法与解析
    MVC学习手册之数据注解与验证
    C#数字图像处理算法学习笔记(三)--图像几何变换
    关于变量名与类名同名问题
    C# 计时器
    C#入门--索引器
    C#入门--字段与属性
    var与dynamic
  • 原文地址:https://www.cnblogs.com/Laughing-Lz/p/5356523.html
Copyright © 2020-2023  润新知