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

news2024/11/24 0:46:39

 
 

目录

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.coloradmin.cn/o/1422652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一键给家长私发成绩

各位老师&#xff0c;你们是否也有过这样的经历&#xff1a;每到考试后&#xff0c;为了将学生的成绩一一发给家长&#xff0c;费尽心思地整理、核对&#xff0c;甚至有时候还要加班。如今&#xff0c;有了易查分&#xff0c;这一切似乎变得轻松起来。但这个功能真的是老师们的…

【教学类-44-04】20240130 print dashed(虚线字体)制作的数字描字帖

作品展示&#xff1a;背景需求&#xff1a; 制作绿色数字的数字描字帖 选用字体&#xff1a;print dashed&#xff08;虚线字体&#xff09; 【教学类-44-03】20240111阿拉伯数字字帖的字体&#xff08;三&#xff09;——德彪钢笔行书&#xff08;实线字体&#xff09;和pri…

Java玩转《啊哈算法》排序之快速排序

心无挂碍&#xff0c;无挂碍故&#xff0c;无有恐怖&#xff0c;远离颠倒梦想&#xff0c;究竟涅槃。 地图 引子代码地址快速排序核心代码优劣完整代码演示 课后习题 引子 搭嘎好&#xff01;本人最近看的《啊哈算法》这本书写的确实不错&#xff0c;生动形象&#xff0c;在保…

详解SpringCloud微服务技术栈:深入ElasticSearch(2)——自动补全、拼音搜索

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;深入ElasticSearch&#xff08;1&#xff09;——数据聚合 &#x1f4da;订阅专栏&…

STM32——温湿度LCD显示并上传手机

STM32——温湿度LCD显示并上传手机 1.LCD1602 硬件接线 D0~D7 – A0~A7 RS – B1 RW – B2 EN – B10 V0 – GND&#xff08;正视看不到显示结果&#xff0c;需要侧着看。否则需要接可调电阻&#xff09; 引脚封装 RS、RW、EN三根信号线经常需要进行拉高/拉低操作&…

JAVAEE初阶 网络编程(八)

IP协议 认识IP协议 在认识IP协议之前&#xff0c;我们首先要明确IP协议的工作范围或者是用途。 &#xff08;1&#xff09; 地址管理&#xff1a;使用一套地址体系&#xff0c;来描述互联网上各个设备所处的为止。 &#xff08;2&#xff09; 路由选择&#xff1a;数据包如何从…

使用linux进程管理工具supervisor管理你的多个应用进程(支持web界面)

前言 supervisor可以帮你管理进程&#xff0c;你只需要编写配置文件&#xff0c;supervisor便可以方便控制启动&#xff0c;暂停&#xff0c;重启某个进程&#xff0c;你可以编写进程启动命令&#xff0c;来控制supervisor要进行的操作 流程 安装 sudo yum update sudo yum…

U2net:Going deeper with nested u-structure for salient object detection

u2net是目前stable-diffusion-webui默认的抠图算法&#xff0c;但是在电商图场景实测下来&#xff0c;效果是很一般的。 1.introduction 1.能否设计一个新的网络用语SOD&#xff0c;允许从头训练&#xff1b;2.保持高分辨率特征图的同时网络更深。U2net是一种为SOD设计的两级…

3671系列矢量网络分析仪

01 3671系列矢量网络分析仪 产品综述&#xff1a; 3671系列矢量网络分析仪产品包括3671C&#xff08;100kHz&#xff5e;14GHz&#xff09;、3671D&#xff08;100kHz&#xff5e;20GHz&#xff09;、3671E&#xff08;100kHz&#xff5e;26.5GHz&#xff09;、3671G&#x…

性能评测工具+数据库主从复制方案

PTS&#xff08;Performance Testing Service&#xff09; 面向所有技术背景人员的云化测试工具 MSQL MGR 8.0 高可用 对性能影响比较大的参数 MyBatis 数据库主从复制 解决方案1 方案2 主从复制经典架构

Gateway API 实践之(六)FSM Gateway 的健康检查功能

FSM Gateway 流量管理策略系列&#xff1a; 故障注入黑白名单访问控制限速重试会话保持健康检查负载均衡算法TLS 上游双向 TLS 网关的健康检查功能是一种自动化监控机制&#xff0c;用于定期检查和验证后端服务的健康状况&#xff0c;确保流量只被转发到那些健康且能正常处理请…

机器学习算法-----K-近邻算法

1.1 K-近邻算法简介 1.定义: 就是通过你的"邻居"来判断你属于哪个类别 2.如何计算你到你的"邻居"的举例 一般时候&#xff0c;都是使用欧氏距离 1.2k近邻算法api初步使用 1.sklearn 优势: 1.文档多&#xff0c;且规范&#xff0c…

谷达冠楠:抖音开店怎么运营好

在数字营销的海洋中&#xff0c;抖音如同一艘快艇&#xff0c;以其独特的视频形式和庞大的用户基础成为商家们的新宠。开店容易&#xff0c;运营难。要想在抖音上成功运营店铺&#xff0c;需要掌握一些核心技巧。 首当其冲的是内容创意。抖音的用户喜好多变&#xff0c;因此&am…

AI 神助攻,协同办公神器 ---- ONLYOFFICE

人工智能不会取代人&#xff0c;只会淘汰那些不会使用人工智能的人。 – 鲁迅 一、人工智能重新定义办公新模式 随着GPT的横空出世&#xff0c;AI的应用场景已经无处不在&#xff0c;从智能客服、智能语音助手、智能家居到自动驾驶汽车等&#xff0c;AI正在不断地拓展其应用领…

关于缓存数据一致性的解决方案

缓存数据一致性 引入缓存会导致一些比如修改/删除内容后缓存还是之前的数据&#xff0c;这会导致缓存和数据库数据不一致的情况&#xff0c;本文将提到相关的解决方案&#xff0c;而且还提供了canal去实现每次在更新数据库的时候自动同步缓存&#xff0c;而无需将代码都写在后…

操作系统基础:进程同步【上】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 1 进程同步&#xff08;上&#xff09;1.1 进程同步与互斥1.1.1 进程同步1.1.1.1 必要性1.1.1.2 什么是进程同步 1.1.2 进程互斥1.1.2.1 必要性1.1.2.2 什么是进程互斥1.1.…

RTC 滴答计时器

1. RTC 滴答计时器 1.1 寄存器配置 RTCCON RTC控制寄存器 [7:4] 0000 设置频率 [8] 1 使能滴答计时器 TICNT 32位滴答时间计数值。 滴答计时器是一个上行计数器。如果当前的滴答数达到这个值&#xff0c;滴答时间中断发生。 备注:该值必须大于3 周期 (n 1)/滴答时钟…

文件制作二维码的图文教学,多种格式都可以使用

现在我们经常会发现在扫描二维码的时候&#xff0c;可能一个二维码中会存在多个文件或者多个二维码中会显示不同的文件的&#xff0c;那么这些文件存入二维码中是用什么方法制作的呢&#xff1f; 文件二维码的制作方法其实很简单&#xff0c;只需要通过文件二维码生成器工具的…

这都2024年了 你还要多久才能领悟 LinkedList 源码

这都2024年了 你还要多久才能领悟 LinkedList 源码 文章目录 这都2024年了 你还要多久才能领悟 LinkedList 源码LinkedList 简介LinkedList 插入和删除元素的时间复杂度&#xff1f;LinkedList 为什么不能实现 RandomAccess 接口&#xff1f; LinkedList 源码分析初始化插入元素…

【数据结构之二叉树的构建和遍历】

数据结构学习笔记---009 数据结构之二叉树1、二叉树的概念和结构1.1、回顾二叉树的重要性质1.2、回顾二叉树的主要分类1.1、如何实现二叉树&#xff1f; 2、二叉树的实现2.1、二叉树的BinaryTree.h2.2、二叉树的BinaryTree.c2.2.1、二叉树的构建2.2.2、二叉树销毁2.2.3、二叉树…