顺序表实现

简介: 顺序表实现

顺序表

概念

顺序表是一段用物理地址的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数字的增删查改。

顺序表一般可分为:

  • 静态顺序表:使用定长数组存储
  • 动态顺序表:使用动态开辟的数组村粗

顺序表的实现

静态顺序表使用于确定知道需要存多少数据的场景

静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用

如何实现循序表?

  • 第一步首先定义类的属性
    我们根据定义知道顺序表的底层是一个数组,所以我们首先要定义数组这个属性,但怎么来记录数组中已经存了几个数呢?所以这里我们需要重新定义一个属性就是usedSize来记录数组中的数的个数。
public class List {
    public int[] elem;
    public int usedSize;
    public List() {
        this.elem = new int[10];//构造方法,详情看类和对象
    }
}
  • 第二步
    实现各种接口

打印顺序表

public void display() {
    for(int i = 0; i < this.usedSize; i++) {
        System.out.print(this.elem[i] + " ");
    }
    System.out.println();
}

在pos位置新增元素

假如,如图所示

我们可以看到在POS=2位置添加元素,需要将pos=2之后的数据全部向后移动一位,才能将pos=2的位置腾出来,全部移动一位之后变为:

具体代码如何实现:

从后往前遍历

public void add(int pos, int date) {
    for(int i = this.usedSzie; i >= pos; i--) {
        elem[i+1] = elem[i];
    }
    this.elem[pos] = date;
    this.usedSzie ++;
}

判定是否包含某个元素

遍历这个顺序表如果存在就返回true,否则返回false

public boolean contains(int date) {
    for(int i = 0; i < this.usedSize; i++) {
        if(elem[i] == date) {
            return true;
        }
    }
    return false;
}

查找某个元素的位置

像刚才查找是否存在一样,只不过放回的是下标

public int search(toFind) {
    for(int i = 0; i < this.usedSize; i++) {
        if(this.elem[i] == toFind) {
            return i;
        }
    }
    return -1;
}

获取pos位置的元素

public int getPos(int pos) {
    return this.elem[pos];
}

给pos位置的元素设为value

public void setPos(int pos,int value) {
    this.elem[pos] = value;
}

删除第一次出现的关键字key

只需要找到第一次出现这个关键字的下标,然后让后面的数字都往前移动一位

初始位置是这样:

假设这里删除66

这样66就没有了

public void remove(int key) {
    int pos = search(key);
    for(int i = pos; i < this.usedSize; i++) {
        this.elem[i] = this.elem[i+1];
    }
    this.usedSize --;
}

获取顺序表的长度

public int size() {
    return this.usedSize;
}

清空顺序表

直接让usedSize为0即可

public void clear() {
    this.usedSize = 0;
}

顺序表的问题

  • 顺序表中间(头部)的增减(删除)时间复杂度为O(N)
  • 增容需要申请空间,拷贝数据,释放旧空间。会有不小的消耗

这些问题如何解决,单链表应运而生。


相关文章
|
6月前
|
JSON 数据可视化 API
产品经理的技术必修课:四步掌握API设计核心逻辑
产品经理的技术必修课:四步掌握API设计核心逻辑
271 83
|
8月前
|
NoSQL Java API
在Java环境下如何进行Redis数据库的操作
总的来说,使用Jedis在Java环境下进行Redis数据库的操作,是一种简单而高效的方法。只需要几行代码,就可以实现复杂的数据操作。同时,Jedis的API设计得非常直观,即使是初学者,也可以快速上手。
363 94
|
JavaScript
Vue3按钮(Button)
这是一个高度可定制的按钮组件,支持多种属性设置,包括按钮类型、形状、图标、尺寸、背景透明度、波纹颜色、跳转地址、打开方式、禁用状态、加载状态及指示符样式等。预览图展示了不同配置下的按钮样式变化。组件通过Vue实现,并提供了丰富的自定义选项以适应各种场景需求。
848 1
Vue3按钮(Button)
|
7月前
|
开发者
(在线CAD控件)网页CAD实现粗糙度标注的方法
本文介绍了通过MxCAD二次开发实现机械制图中表面粗糙度符号的标注功能。表面粗糙度符号用于表示零件表面微观不平度,基本形式为三角形,可结合不同修饰(如加横线、小圆等)表达具体加工要求。文章解析了符号含义,并基于McDbCustomEntity类创建自定义实体,实现符号绘制、数据持久化、夹点设置等功能。此外,还提供了用户交互式标注方法,支持根据直线、圆弧或指定角度生成粗糙度标注。最后展示了效果演示及扩展开发示例,便于开发者进一步定制功能。
|
消息中间件 前端开发 数据库
RocketMQ实战教程之MQ简介与应用场景
RocketMQ实战教程介绍了MQ的基本概念和应用场景。MQ(消息队列)是生产者和消费者模型,用于异步传输数据,实现系统解耦。消息中间件在生产者发送消息和消费者接收消息之间起到邮箱作用,简化通信。主要应用场景包括:1)应用解耦,如订单系统与库存系统的非直接交互;2)异步处理,如用户注册后的邮件和短信发送延迟处理,提高响应速度;3)流量削峰,如秒杀活动限制并发流量,防止系统崩溃。
|
消息中间件 Unix Linux
【C语言】进程和线程详解
在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
417 6
|
SQL 存储 人工智能
OceanBase CTO杨传辉谈AI时代下数据库技术的创新演进路径!
在「DATA+AI」见解论坛上,OceanBase CTO杨传辉先生分享了AI与数据库技术融合的最新进展。他探讨了AI如何助力数据库技术演进,并介绍了OceanBase一体化数据库的创新。OceanBase通过单机分布式一体化架构,实现了从小规模到大规模的无缝扩展,具备高可用性和高效的数据处理能力。此外,OceanBase还实现了交易处理、分析和AI的一体化,大幅提升了系统的灵活性和性能。杨传辉强调,OceanBase的目标是成为一套能满足80%工作负载需求的系统,推动AI技术在各行各业的广泛应用。关注我们,深入了解AI与大数据的未来!
OceanBase CTO杨传辉谈AI时代下数据库技术的创新演进路径!
|
Java 索引
Object有哪些常用方法
掌握这些方法不仅能够帮助你编写出更加健壮和高效的Java代码,还能加深对面向对象编程概念的理解。在实际开发中,合理利用 `Object`类提供的方法能够有效提升代码的可读性、可维护性和性能。
348 0
|
SQL Java 调度
实时计算 Flink版产品使用问题之使用Spring Boot启动Flink处理任务时,使用Spring Boot的@Scheduled注解进行定时任务调度,出现内存占用过高,该怎么办
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
前端开发 Java Spring
方法参数相关属性params、@PathVariable和@RequestParam用法与区别
方法参数相关属性params、@PathVariable和@RequestParam用法与区别
279 0

热门文章

最新文章