所谓顺序表,就是顺序存储的线性表。顺序存储就是用一组地址连续的存储单元依次存放线性表中各个数据元素的存储结构。

线性表中所有数据元素的类型是相同的,所以每一个数据元素在存储器中占用相同的大小的空间。假设每一个数据元素占b个存储单元,且a0(即线性表中的第一个数据元素)的存储地址为Loc(a0)(此地址也称为线性表的基地址),则第i个数据元素的地址可表示为:

Loc(ai)=Loc(a0)+i*b 其中0<=i&&i<=n-1

从以上可知,只要顺序表的基地址和每一个数据元素所占的存储空间的大小,就可以计算出第i个数据元素的地址,即顺序表具有按数据元素的位序号随机存取的特点。

顺序表的特点:

  1. 线性表中逻辑上响铃的数据元素,在物理存储位置上也是相邻的

  2. 存储密度高,但需要预先分配“足够应用”的存储空间(也就是够用的存储空间),这可能将会造成存储空间的浪费;其中,存储密度=数据元素本身值所需的存储空间/该数据元素实际所占用的空间

  3. 便于随机存取

  4. 不便于插入和删除操作,这是因为在顺序表上进行插入和删除操作会引起大量的数据元素的移动

因为数组也具有随机存取的特点。为此,一般,顺序表采用数组来进行实现

顺序表的实现代码:

public class ArrayList<T> implements List<T>
{
private Object[] listElem;//顺序表的存储空间
private int curLen;//顺序表当前长度
public ArrayList(int maxSize)
{
this.listElem=new Object[maxSize];
this.curLen=0;
}
public void clear()//清空
{
this.curLen=0;
}
public boolean isEmpty()//判空
{
return this.curLen==0;
}
public int length()//求长度
{
return this.curLen;
}
public T get(int i)throws Exception//按位查找(在查找前判断位置是否合法),时间复杂度为O(1)
{
if(i<0||i>this.curLen-1)
throw new Exception(“查找的位置不合法”);
return (T)this.listElem[i];
}
public int indexOf(T x)//按值查找,时间复杂度为O(n)
{
int j=0;
while(j<this.curLen&&!((T)this.listElem[j]).equals(x))
j++;
if(j<this.curLen)
return j;
else
return -1;
}
public void insert(int i,T x)throws Exception//插入,时间复杂度为O(n)
{
if(this.curLen==listElem.length)//判断其否无法再加入元素
throw new Exception(“顺序表已满”);
if(i<0||i>this.curLen)
throw new Exception(“插入位置不合法”);
for(int j=this.curLen;j>i;j--)//将后面的元素往后移动
{
listElem[j]=listElem[j-1];
}
listElem[i]=x;
this.curLen++;
}
public void remove(int i)throws Exception//删除操作,时间复杂度为O(n)
{
//if(isEmpty())
//throw new Exception(“顺序表为空”);
if(i<0||i>this.curLen-1)
{
throw new Exception(“删除位置不合法”);
}
for(int j=i;j<this.curLen-1;j++)
listElem[j]=listElem[j+1];
this.curLen--;
}
}

从以上的实现中可以看出,对于顺序表而言,其插入,删除,以及按值查找的操作的时间复杂度为O(n),从而可知,顺序表有如下局限性:

  1. 若要将线性表扩充存储空间,则需要重新创建一个地址连续的更大的存储空间,并把所有的数据元素都复制到新的存储空间中;

  2. 因为顺序存储要求逻辑上相邻的数据元素,在物理存储位置上也是要相邻的,这就使得要增删数据元素则会引起平均约一半的数据元素的移动。

为此,顺序表较适合表示“静态”的线性表,即线性表一旦形成之后,就很少进行插入和删除操作。对于需要频繁执行插入和删除操作的“动态”线性表,通常采用链式存储结构。

回到目录|·(工)·)

K:线性表的实现—顺序表的更多相关文章

  1. PHP数据结构之二 线性表中的顺序表的PHP实现

    线性表 (一)基本特点:最基本.最简单.最常用的一种数据结构 在这种结构中: 1.存在一个唯一的被称为“第一个”的数据元素: 2.存在一个唯一的被称为“最后一个”的数据元素: 3.除第一个元素外,每个 ...

  2. 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】

    本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...

  3. c++实现线性表中的顺序表(数据结构课程作业)

    一.题目简介 实现顺序表的创建.初始化.赋值.插入.删除.按数据查找元素位置.按元素位置查找数据.清空.删除 的操作,以上操作用可用菜单选项完成 二.源程序代码 #include<iostrea ...

  4. 老郭带你学数据结构(C语言系列)2-线性表之动态顺序表

    一.基本概念: 线性表:由n个类型相同的数据元素组成的有限序列,记为(a1,a2,--an). 线性表的特征:其中的元素存在这序偶关系,元素之间存在着严格的次序关系. 顺序存储表:线性表中的元素依次存 ...

  5. 老郭带你学数据结构(C语言系列)1-线性表之静态顺序表

    在学习之前,先说下我的软件情况,操作系统是manjaro linux 今天刚刚升级的,编辑器是vim8.0.55,编译器是gcc 6.2.1,调试器是gdb 7.12,版本再低点也可以,只要gcc版本 ...

  6. 数据结构:队列 链表,顺序表和循环顺序表实现(python版)

    链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...

  7. 线性表之顺序表(C语言实现)

    线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一 ...

  8. 【数据结构】线性表&&顺序表详解和代码实例

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 预备知识 1.0 什么是线性表? 线性表(List)是零个或者多个数据元素的有限序列. 首先它是一个序列.里面的元素是有顺 ...

  9. 线性表——顺序表的实现与讲解(C++描述)

    线性表 引言 新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这 ...

随机推荐

  1. 护网杯圆满结束,还不满足?不如来看看大佬的WP扩展思路~

    护网杯预选赛 WP转载自:https://qingchenldl.github.io/2018/10/13/%E6%8A%A4%E7%BD%91%E6%9D%AFWP-BitPwn/#more WEB ...

  2. Generating an arbitrary digit password dictionary

    原理说明:以增量方式从开始到结束! 实现方法:CMD命令 特点:纯数字 语法: FOR /L %variable IN (start,step,end) DO command [command-par ...

  3. HBase二级索引的设计

    摘要 最近做的一个项目涉及到了多条件的组合查询,数据存储用的是HBase,恰恰HBase对于这种场景的查询特别不给力,一般HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowK ...

  4. 【C++对象模型】使用gcc、clang和VC++显示C++类的内存布局

    引言 各种C++实现对C++类/对象的内存布局可能有所不同,包括数据成员的顺序.虚函数表(virtual table: vtbl)的结构.继承关系的处理等.了解C++类/对象的布局,对于理解C++各种 ...

  5. [实战] 给现有的NGINX二进制RPM包加新模块

    [实战] 给现有的NGINX二进制RPM包加新模块 一.前言 在做 wiki 的镜像,这样以后文章就可以使用外链了(链接直接跳转墙内小站). 遇到的问题就是:我的 NGINX 包安装的时候图方便采用 ...

  6. python基础知识梳理----3基本数据类型,int,bool,str ,for 循环,迭代

    一:python的基本类型 1.int  -----整数,主要进行数学运算 2.str  -----字符串,可以保存少量数据,并进行相关操作, 3. bool ---布尔类型,判断真假 4.list ...

  7. 人工鱼群算法超详细解析附带JAVA代码

    01 前言 本着学习的心态,还是想把这个算法写一写,给大家科普一下的吧. 02 人工鱼群算法 2.1 定义 人工鱼群算法为山东大学副教授李晓磊2002年从鱼找寻食物的现象中表现的种种移动寻觅特点中得到 ...

  8. webService基本概念、元素及简单编码实现

    webService "网络服务"(Web Service)的本质,就是通过网络调用其他网站的资源. 网络服务是相对于本地服务来说的,本机完成本机需要完成的任务,叫"本地 ...

  9. Prufer序列与树的计数(坑)

    \(prufer\)序列: 无根树转\(prufer\)序列: 不断找编号最小的叶子节点,删掉并在序列中加入他相连的节点. \(prufer\)转无根树: 找到在目前\(prufer\)序列中未出现且 ...

  10. idea 验证码

    N757JE0KCT-eyJsaWNlbnNlSWQiOiJONzU3SkUwS0NUIiwibGljZW5zZWVOYW1lIjoid3UgYW5qdW4iLCJhc3NpZ25lZU5hbWUiO ...