【数据结构】(二)线性表List

 
 

目录

1、基本概念

2、栈(Stack)

3、队列(Queue)

4、串(String)


1、基本概念

(1)线性表是零或多个数据元素的有限序列。

(2)数组长度指存储空间长度,线性表长度指数据元素个数

(3)顺序存储结构的三个属性:数组data,数组长度MAXSIZE,线性表当前长度length;查找时间复杂度为O(1),插入删除的时间复杂度为O(n)。

插入算法思路:

(i) 如果插入位置不合理,抛出异常;

(ii) 如果线性表长度 ≥\geq 数组长度,则抛出异常或动态增加容量;

(iii) 从最后一个元素开始向前遍历到第 i 个位置,分别将它们都向后移动一个位置;

(iv) 将要插入的元素填入位置i处,表长+1即可。

删除算法思路:

(i) 如果删除位置不合理,抛出异常;

(ii) 取出删除元素;

(iii) 从删除元素位置开始遍历到最后一个元素位置,将它们都向前移动一个位置,表长-1即可。

(4)链式存储结构,查找时间复杂度为O(n),插入删除时间复杂度为O(1)。

(i) 结点(Node)包含数据域(存储数据元素信息)和指针域(存储直接后继位置)。

(ii) n个结点连接成一个链表,即线性表的链式存储结构。

(iii) 链表第一个结点的存储位置称为头指针(链表的必要元素),最后一个结点指针为空NULL

(iv) 常在单链表的第一个结点前附设一个结点,称为头结点,其数据域可以不存储任何信息,指针域则存储指向第一个结点的指针。头结点非必需元素,若线性表为空表,则头结点指针域为空NULL。

假设p是指向线性表第 i 个元素的指针,则数据域表示为p -> data,值为数据元素;指针域表示为p -> next,值为一个指针,指向第 i+1个元素,关系如下图所示:

(5)静态链表:用数组描述的链表

(i) 数组元素都由data和cur组成,前者存放数据元素,后者相当于单链表中的指针,存放该元素的后继在数组的下标。如下将甲、乙、丙、丁、戊等数据存入静态链表:

(ii) 优点是在插入删除操作中只需要修改cur而不用移动元素,缺点是仍连续存储,表长难以确定。

(6)循环链表(Circular Linked List):终端结点的指针由空NULL改为指向头结点即形成循环。

(7)双向链表(Double Linked List):每个结点再额外设置一个指向其前驱结点的指针域即可。

双向链表的结点表示关系有p -> next -> prior相当于 p 也相当于p -> prior -> next。

(i)插入操作顺序思路:s -> prior = p; s -> next = p -> next; p ->next ->prior = s; p ->next = s;

(ii)删除操作顺序思路:p -> prior -> next = p ->next; p ->next ->prior = p -> prior; free (p);

2、栈(Stack)

(1)栈是只在表尾即栈顶(top)端进行插入即进栈(push)和删除即出栈(pop)操作的线性表。另一端称为栈底(bottom),属于先进后出(Last In First Out)即LIFO结构。

(2)栈的顺序存储结构

定义下标为0的一端作为栈底,top变量指示栈顶元素在数组中的位置,若栈长为Stack_Size,则top必须小于Stack_Size。通常将空栈的判定条件设为top为-1,当栈存在一个元素时,top等于0。

(3)栈的链式存储结构

把栈顶top放在单链表头部,链栈为空就是 top == NULL 的时候。

顺序栈与链栈的进栈push出栈pop操作时间复杂度均为O(1),但顺序栈需要实现确定一个固定长度,方便存取;链栈则每个元素额外添加指针域,增大内存开销

(4)栈的应用——递归——斐波那契数列

递归就是调用自己。我们把直接调用自己或者通过一系列调用语句间接地调用自己的函数称为递归函数。每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。以下模拟代码中 i=5 的执行过程:

(5)栈的应用——四则运算表达式求值

(i) 后缀表示法(Reverse Polish Notation):所有的符号都是在运算数字后面出现,省去括号。

正常表达式:9 + (3-1) * 3 + 10 / 2

后缀表达式:9 3 1 - 3 * + 10 2 / +

规则:从左到右遍历表达式每个数字和符号,遇到数字就进栈,遇到符号则将处于栈顶两个数字出栈,进行运算,运算结果出栈,一直到最终获得结果。

(ii) 中缀表达式转后缀表达式

标准四则运算表达式9 + (3 - 1) * 3+10 / 2 称为中缀表达式,则转后缀表达式的规则如下:

从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,直到最终输出后缀表达式为止 。

3、队列(Queue)

(1)只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的一端称为队尾(Rear),允许删除的一端称为队头(Front),属于先进先出(First In First Out)的FIFO操作。

(2)队列顺序存储结构

(i) front指针指向队头元素,rear指针指向队尾元素的下一个位置,当front == rear时队列为空。

(ii) 设一个长度为5的数组初始状态如下图所示,先让 a1a_{1} 、a2a_{2}、a3a_{3}、a4a_{4}入队,接着a1a_{1}和a2a_{2}出队,再让a5a_{5}入队,整体入队出队的流程如下图,最终rear指向队列外会形成假溢出现象。因此队列也经常采用循环结构。

(iii) 循环队列:头尾相接的顺序存储队列结构,使插入删除时间复杂度为O(1)。更新队列已满的条件是(rear + 1) % Queue_Size == front,通用队列元素个数的计算公式为(rear - front + Queue_Size) % Queue_Size。

(3)队列链式存储结构

(i) 队列链式结构实际就是只能尾进头出的单链表,队头指针front指向链队列的头结点,队尾指针rear指向终端结点。空队列时,front和rear都指向头结点。

(ii) 入队操作就是在链表尾部插入结点,出队操作就是头结点的后继结点出队,将头结点的后继改为它后面的结点,若链表除了头结点外只剩一个元素,则需将rear指向头结点。

(4)从时间上,循环队列和链队列的入队出队操作都是O(1);空间上看,循环队列需要一个固定长度,有存储元素个数和空间浪费的问题。若可以确定队列MAX长度,可用循环队列,若无法预测队列长度,则用链队列。

4、串(String)

(1)串是由零个或多个字符组成的有限序列,一般记为s = " a1a_{1}a2a_{2}a3a_{3}a4a_{4}……ana_{n}"(n ≥\geq 0),字符数目n称为串的长度。无字符无任何内容的串称为空串"",但空格串是只包含空格的串" ",有内容也有长度。

(2)串的比较通过组成串的字符之间的编码,如给定两个串:s = " a1a_{1}a2a_{2}a3a_{3}a4a_{4}……ana_{n}"(n ≥\geq 0),t = " b1b_{1}b2b_{2}b3b_{3}b4b_{4}……bmb_{m} "(m≥\geq0),当满足以下条件之一时,s < t。

(i) n < m,且 aia_{i} < bib_{i} ( i = 1,2,……,n)

(ii)存在某个 k < min(m,n),使得aia_{i} = bib_{i} ( i = 1,2,……,k-1),aka_{k} < bkb_{k}

(3)串的顺序存储结构:用一组地址连续的存储单元来存储字符序列。

(4)串的链式存储结构:容易造成空间浪费,不够灵活。

(5)KMP模式匹配算法

把子串各个位置 j 值的变化定义为一个数组next,则next的长度就是子串的长度,函数定义为:

前缀:包含首字母但不包含尾字母的所有子串;后缀:只包含尾字母但不含首字母的所有子串。

next数组值即寻找子串中“最大的相同前后缀长度的下一个”,前两个值为0、1。

Next_val数组由next数组得到,首位为0,下一位字符它的next值与 j 序号对应,若对应字符不同,则next_val值即为next值;若对应字符相同,则next_val值同为对应j序号的next_val值。

注:KMP模式匹配算法有不同标准表达方式,重在理解思想即可。这里推荐在B站搜KMP相关高播放量网课,看看代码随想录卡哥录的或是动画演示那些,有助于理解消化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/250392.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 网络拦截器统一处理请求参数和返回值加解密实现

前言 项目中遇到参数加密和返回结果加密的业务 这里写一下实现 一来加深记忆 二来为以后参考铺垫 需求 项目在开发中涉及到 登陆 发验证码 认证 等前期准备接口 这些接口需要单独处理 比如不加密 或者有其他的业务需求 剩下的是登陆成功以后的业务需求接口 针对入参和返回值…

软件功能测试如何确定测试需求?CMA、CNAS软件测试报告获取

软件功能测试是为了验证软件的功能是否按照设计要求正常工作的过程&#xff0c;可以确保软件的质量&#xff0c;提高用户体验&#xff0c;也是保证软件安全和可靠性的重要一环。我们需要从多个角度对软件的各个功能模块进行测试&#xff0c;确保每个功能都能正常运行&#xff0…

069:vue中EventBus的使用方法(图文示例)

第069个 查看专栏目录: VUE ------ element UI 本文章目录 示例背景示例效果图示例源代码父组件&#xff1a;子组件A&#xff1a;子组件B&#xff1a;eventbus/index.js&#xff1a; EventBus的基本使用方法&#xff1a; 示例背景 在Vue中&#xff0c;使用EventBus可以实现组件…

Python||五城P.M.2.5数据分析与可视化_使用华夫图分析各个城市的情况(上)

目录 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成都市&#xff0c;使用华夫图分析各个城市的情况 1.北京市的空气质量 2.广州市的空气质量 【上海市和成都市空气质量情况详见下期】 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成…

红日三打靶!!!

红日三&#xff0c;黑盒测试 环境搭建一.外网打点1.网段探测2.端口服务扫描3.目录扫描4.网站漏洞扫描5.汇总&#xff0c;找破绽6.登陆MySQL改密码 7.进入后台&#xff0c;找能写马的地方8.蚁剑连接9.disable_functions绕过1.蚁剑插件绕过2.bypass_disablefunc_via_LD_PRELOAD绕…

深兰科技陈海波出席CTDC2024第五届首席技术官领袖峰会:“民主化AI”的到来势如破竹

1月26日&#xff0c;CTDC 2024 第五届首席技术官领袖峰会暨出海创新峰会在上海举行。深兰科技创始人、董事长陈海波受邀出席了本届会议&#xff0c;并作为首个演讲嘉宾做了题为“前AGI时代的生产力革命范式”的行业分享。 作为国内顶级前瞻性技术峰会&#xff0c;CTDC首席技术官…

【数据结构 06】二叉树

一、原理 二叉树算法核心思维&#xff1a;递归 满二叉树&#xff1a;二叉树的层数为K&#xff0c;节点数为 完全二叉树&#xff1a;二叉树的层数为K&#xff0c;前K-1层是满的&#xff0c;第K层是连续的 满二叉树是完全二叉树的子集。 任意二叉树&#xff1a;若叶子节点的…

2024-01-07-AI 大模型全栈工程师 - 做自己的产品经理

摘要 2024-01-07 周日 杭州 阴 本节内容: a. 如何做好独立开发设计&#xff0c;实现财富自由&#xff1b; 课程内容 1. 独立开发者 英文 indie hacker&#xff0c;是指独立开发软件产品的人&#xff1b;一人承担一个项目产品的所有工作&#xff1b; 2. 创业机会 云计算设…

学习使用Flask模拟接口进行测试

前言 学习使用一个新工具&#xff0c;首先找一段代码学习一下&#xff0c;基本掌握用法&#xff0c;然后再考虑每一部分是做什么的 Flask的初始化 app Flask(__name__)&#xff1a;初始化&#xff0c;创建一个该类的实例&#xff0c;第一个参数是应用模块或者包的名称 app…

Java宝典-数据类型

目录 1.变量与常量2.Java中的数据类型3.整型3.1 字节型byte3.2 短整型short3.3 整型int3.4 长整型long 4.浮点型4.1 单精度浮点型float4.2 双精度浮点型double 5.字符型6.布尔型7.类型转换7.1 隐式类型转换7.2 显示类型转换(强制类型转换) 8.类型提升 大家好,我是你们的Vampire…

华为数通方向HCIP-DataCom H12-821题库(单选题:401-420)

第401题 R1的配置如图所示,此时在R1查看FIB表时,关于目的网段192.168.1.0/24的下跳是以下哪一项? A、10.0.23.3 B、10.0.12.2 C、10.0.23.2 D、10.0.12.1 【答案】A 【答案解析】 该题目考查的是路由的递归查询和 RIB 以及 FIB 的关系。在 RIB 中,静态路由写的是什么,下…

PPT录屏功能在哪?一键快速找到它!

在现代办公环境中&#xff0c;ppt的录屏功能日益受到关注&#xff0c;它不仅能帮助我们记录演示文稿的播放过程&#xff0c;还能将操作过程、游戏等内容完美录制下来。可是很多人不知道ppt录屏功能在哪&#xff0c;本文将为您介绍ppt录屏的打开方法&#xff0c;以帮助读者更好地…

网络原理TCP/IP(2)

文章目录 TCP协议确认应答超时重传连接管理断开连接 TCP协议 TCP全称为"传输控制协议(Transmission Control Protocol").⼈如其名,要对数据的传输进⾏⼀个详细 的控制; TCP协议段格式 • 源/目的端口号:表⽰数据是从哪个进程来,到哪个进程去; • 32位序号/32位确认…

spring问题点

1.事务 1.1.事务传播 同一个类中 事务A调非事务B B抛异常 AB事务生效&#xff08;具有传播性&#xff09; 同一个类中 事务A调非事务B A抛异常 AB事务生效 也就是主方法加了事务注解 则方法内调用的其他本类方法无需加事务注解&#xff0c; 发生异常时可以保证事务的回滚 最常…

day07-CSS高级

01-定位 作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 1.定位模式&#xff1a;position 2.边偏移&#xff1a;设置盒子的位置 left right top bottom 相对定位 position: relative 特点&#xff1a; 不脱标&#xff0c;占用自己原来位置 显示模…

跟着cherno手搓游戏引擎【14】封装opengl

本节先把代码粘上&#xff0c;后续会慢慢把注释都给加上&#xff0c;先看代码了解个大概&#xff08;待更新&#xff09; 前置&#xff1a; RendererAPI.h: #pragma once namespace YOTO {enum class RendererAPI {None 0,OpenGL1};class Renderer {public:inline static R…

(每日持续更新)jdk api之NotSerializableException基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

Flink 流式读取 Debezium CDC 数据写入 Hudi 表无法处理 -D / Delete 消息

问题场景是&#xff1a;使用 Kafka Connect 的 Debezium MySQL Source Connector 将 MySQL 的 CDC 数据 &#xff08;Avro 格式&#xff09;接入到 Kafka 之后&#xff0c;通过 Flink 读取并解析这些 CDC 数据&#xff0c;然后以流式方式写入到 Hudi 表中&#xff0c;测试中发现…

【爬虫专区】批量下载PDF (无反爬)

天命&#xff1a;只要没反爬&#xff0c;一切都简单 这次爬取的是绿盟的威胁情报的PDF 先看一下结构&#xff0c;很明显就是一个for循环渲染 burp抓包会发现第二次接口请求 接口请求一次就能获取到了所有的数据 然后一个循环批量下载数据即可&#xff0c;其实没啥难度的 imp…

如何安装MySQL

如何安装MySQL 前提条件下载MySQL在 Windows 上安装 MySQL验证 MySQL 安装 MySQL是当今工业界广泛使用的最流行的关系数据库管理软件之一。它通过各种存储引擎提供多用户访问支持。它得到了甲骨文公司的支持。在本节中&#xff0c;我们将学习如何为初学者下载和安装 MySQL。 前…