全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

浅谈线性表的原理及简单实现方法

一、线性表

原理:零个或多个同类数据元素的有限序列

原理图:

特点 :

1、有序性

2、有限性

3、同类型元素

4、第一个元素无前驱,最后一个元素无后继,中间的元素有一个前驱并且有一个后继

线性表是一种逻辑上的数据结构,在物理上一般有两种实现 顺序实现和链表实现

二、基于数组的 线性表顺序实现

原理 : 用一段地址连续的存储单元依次存储线性表数据元素。

原理图:

算法原理:

1、初始化一个定长的数组空间 elementData[] , size 存储长度 存储元素

2、通过索引来快速存取元素

3、通过数组复制实现元素的插入和删除

总结:

1、无需为表示表中元素之间的逻辑关系增加额外的存储空间

2、可以快速存取表中任一位置元素

3、插入和删除需要进行数组复制(即大量元素的移动)

4、线性表长度变化较大时,需要频繁扩容,并造成存储空间碎片

实现代码:

接口定义:

package online.jfree.base;

/**
 * author : Guo LiXiao
 * date : 2017-6-14 11:46
 */

public interface LineList <E>{

 /**
  * lineList 是否为空
  * @return
  */
 boolean isEmpty();

 /**
  * 清空 lineList
  */
 void clear();

 /**
  * 获取指定位置元素
  * @param index
  * @return
  */
 E get(int index);

 /**
  * 获取元素第一次出现的位置
  * @param e
  * @return
  */
 int indexOf(E e);

 /**
  * 判断 lineList是否包含指定元素
  * @param e
  * @return
  */
 boolean contains(E e);

 /**
  * 设置指定位置数据,如数据已存在 则覆盖原数据
  * @param index
  * @param e
  * @return
  */
 E set(int index, E e);

 /**
  * 移除指定位置元素
  * @param index
  * @return
  */
 E remove(int index);

 /**
  * 在lineList结尾插入元素
  * @param e
  * @return
  */
 E add(E e);

 /**
  * 在index后面插入元素
  * @param index
  * @param e
  * @return
  */
 E add(int index, E e);

 /**
  * 返回lineList长度
  * @return
  */
 int size();



}

算法实现:

package online.jfree.base;

/**
 * author : Guo LiXiao
 * date : 2017-6-15 13:44
 */

public class OrderedLineList<E> implements LineList<E> {

 private static final int INIT_CAPACITY = 10;

 private transient E[] elementData;

 private transient int elementLength;

 private int size;

 public OrderedLineList() {
  this(0);
 }

 public OrderedLineList(int initCapacity) {
  init(initCapacity);
 }

 private void init(int initCapacity) {
  if (initCapacity >= 0) {
   this.elementData = (E[]) new Object[initCapacity];
   this.elementLength = initCapacity;
  } else {
   throw new IllegalArgumentException("Illegal Capacity: " +
     initCapacity);
  }
  this.size = 0;
 }

 /**
  * 扩容
  */
 private void dilatation() {
  int oldCapacity = this.elementLength;
  int newCapacity = oldCapacity;
  if (oldCapacity <= this.size) {
   newCapacity = oldCapacity + INIT_CAPACITY;
  }else if(oldCapacity - INIT_CAPACITY > this.size){
   newCapacity = oldCapacity - INIT_CAPACITY;
  }
  if (oldCapacity != newCapacity){
   E[] newElementData = (E[]) new Object[newCapacity];
   System.arraycopy(elementData, 0, newElementData, 0, oldCapacity);
   this.elementLength = newCapacity;
   this.elementData = newElementData;
  }
 }

 /**
  * 校验列表索引越界
  * @param index
  */
 private void checkCapacity(int index){
  if (index > this.size - 1 || index < 0)
   throw new IndexOutOfBoundsException(new StringBuffer("[index : ").append(index).append("] , [size : ").append(size).append("] ").toString());
 }

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

 @Override
 public void clear() {
  this.init(0);
 }

 @Override
 public E get(int index) {
  this.checkCapacity(index);
  return this.elementData[index];
 }

 @Override
 public int indexOf(E e) {
  for (int i = 0; i < this.size; i++){
   if (e == null && elementData[i] == null || e.equals(elementData[i])){
    return i;
   }
  }
  return -1;
 }

 @Override
 public boolean contains(E e) {
  return this.indexOf(e) > 0;
 }

 @Override
 public E set(int index, E e) {
  this.checkCapacity(index);
  this.dilatation();
  E oldElement = this.elementData[index];
  this.elementData[index] = e;
  return oldElement;
 }

 @Override
 public E remove(int index) {
  this.dilatation();
  E e = elementData[index];
  if (index == size - 1) elementData[index] = null;
  else {
   int length = size - index - 1;
   System.arraycopy(elementData, index + 1, elementData, index, length);
  }
  size --;
  return e;
 }

 @Override
 public E add(E e) {
  return this.add(size, e);
 }

 @Override
 public E add(int index, E e) {
  this.dilatation();
  if (index == size) elementData[index] = e;
  else {
   index++;
   int lastLength = size - index;
   E[] lastElementData = (E[]) new Object[lastLength];
   System.arraycopy(elementData, index, lastElementData, 0, lastLength);
   elementData[index] = e;
   System.arraycopy(lastElementData, 0, elementData, index + 1, lastLength);
  }
  size ++ ;
  return e;
 }

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

}

以上这篇浅谈线性表的原理及简单实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# 线性表的实现  # 简单介绍线性表以及如何实现双链表  # 线性表  # 给大家  # 有一个  # 定长  # 是一种  # 第一个  # 多个  # 上一  # 数据结构  # 希望能  # 这篇  # 有两种  # 浅谈  # 小编  # 大家多多  # 移除  # 清空  # 为空  # 链表  # interface 


相关文章: 如何通过远程VPS快速搭建个人网站?  广州美橙建站如何快速搭建多端合一网站?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  宝塔面板如何快速创建新站点?  盐城做公司网站,江苏电子版退休证办理流程?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何实现建站之星域名转发设置?  ,网站推广常用方法?  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  家庭建站与云服务器建站,如何选择更优?  javascript中的try catch异常捕获机制用法分析  网站代码制作软件有哪些,如何生成自己网站的代码?  如何在腾讯云服务器快速搭建个人网站?  做企业网站制作流程,企业网站制作基本流程有哪些?  手机网站制作与建设方案,手机网站如何建设?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  制作宣传网站的软件,小红书可以宣传网站吗?  如何用腾讯建站主机快速创建免费网站?  宝塔新建站点报错如何解决?  建设网站制作价格,怎样建立自己的公司网站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  小建面朝正北,A点实际方位是否存在偏差?  公司门户网站制作流程,华为官网怎么做?  建站之星CMS五站合一模板配置与SEO优化指南  如何挑选高效建站主机与优质域名?  如何通过建站之星自助学习解决操作问题?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何在建站之星绑定自定义域名?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  无锡营销型网站制作公司,无锡网选车牌流程?  ui设计制作网站有哪些,手机UI设计网址吗?  临沂网站制作公司有哪些,临沂第四中学官网?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何在云服务器上快速搭建个人网站?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  建站之星会员如何解锁更多建站功能?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何在景安服务器上快速搭建个人网站?  建站之星如何保障用户数据免受黑客入侵?  建站之星导航配置指南:自助建站与SEO优化全解析  建站主机选择指南:服务器配置与SEO优化实战技巧  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  建站之星2.7模板快速切换与批量管理功能操作指南  安云自助建站系统如何快速提升SEO排名?  ,购物网站怎么盈利呢?  如何制作网站标识牌,动态网站如何制作(教程)? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。