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
原文地址:https://www.cnblogs.com/Laughing-Lz/p/5356523.html