【数据结构】(二)线性表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.mzph.cn/news/656561.shtml

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

相关文章

Kotlin快速入门系列6

Kotlin的接口与扩展 接口 与Java类似&#xff0c;Kotlin使用interface关键字定义接口&#xff0c;同时允许方法有默认实现&#xff1a; interface KtInterfaceTest {fun method()fun methodGo(){println("上面方法未实现&#xff0c;此方法已实现")} } 接口实现 …

JS第一课简单看看这是啥东西

1.什么是JavaScript JS是一门编程语言&#xff0c;是一种运行在客户端(浏览器)的编程语言&#xff0c;主要是让前端的画面动起来&#xff0c;注意HTML和CSS不是编程语言&#xff0c;他俩是一种标记语言。JS只要有浏览器就能运行不用跟Python或者Java一样上来装一个jdk或者Pyth…

12306提示人证核验失败问题解决方案

问题环境&#xff1a;手机已经 Root 并且安装了其他软件 认证时提示 官方客服回复: 可能是我的人脸发生了太大变化导致&#xff0c;建议我去身份证的公安部门更新人脸信息&#xff0c;但是想一想又不对&#xff0c;如果发生了大变化所有 App 使用的都是统一的公安部的人脸信息…

探索数字经济:从基础到前沿的奇妙旅程

新一轮技术革命方兴未艾&#xff0c;特别是以人工智能、大数据、物联网等为代表的数字技术革命&#xff0c;催生了一系列新技术、新产业、新模式&#xff0c;深刻改变着世界经济面貌。数字经济已成为重组全球要素资源、重塑全球经济结构、改变全球竞争格局的关键力量。预估到20…

关于maven项目构建的解释

在Idea中使用模块化构建项目 项目介绍&#xff1a; sky-server依赖sky-pojo和sky-common&#xff0c;继承sky-take-outsky-pojo继承sky-take-outsky-common继承sky-take-out 由于Idea编译器自动识别引入的模块&#xff0c;所以在Idea中可以运行项目。 在Idea中使用maven打包…

Redis -- 背景知识

目录 特性 为啥Redis快? 应用场景 Redis不能做什么&#xff1f; Redis是在内存中存储数据的一个中间件&#xff0c;用作为数据库&#xff0c;也可以用作为缓存&#xff0c;在分布式中有很高的威望。 特性 In-memory data structures&#xff1a;在内存中存储数据key-val…

设计模式——职责链模式(Chain of Responsibility Pattern)

概述 职责链模式(Chain of Responsibility Pattern)&#xff1a;避免请求发送者与接收者耦合在一起&#xff0c;让多个对象都有可能接收请求&#xff0c;将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理它为止。职责链模式是一种对象行为…

少儿编程 中国电子学会图形化编程2021年3月等级考试Scratch三级真题解析(选择题、判断题)

1.在《采矿》游戏中&#xff0c;当角色捡到黄金时财富值加1分&#xff0c;捡到钻石时财富值加2分&#xff0c;下面哪个程序实现这个功能&#xff1f; A&#xff1a; B&#xff1a; C&#xff1a; D&#xff1a; 2.设计一个和在20以内&#xff08;包括20&#xff09;的整数加法…

通过docker构建基于LNMP的WordPress项目

计划通过自定义网络模式&#xff0c;创建一个172.18.0.0/16网段 nginx&#xff1a;172.18.0.2:80 php&#xff1a;172.18.0.3:9000 mysql&#xff1a;172.18.0.4:3306 创建nginx的镜像 准备好nginx的安装包 准备nginx的网页目录和wordpress网站目录以及nginx.conf文件 编…

中国地区cetos7.9 install kubeadmin

第 1 步&#xff1a;禁用 SELinux&#xff08;可选但推荐&#xff09; 如何在 CentOS 7 上查找 SELinux 状态 sestatus另一种选择是运行以下 cat 命令&#xff1a; vi /etc/selinux/config SELINUXdisabled rebootcentos7 linux 安装k8s前下面操作的作用是&#xff1f; cat…

用Python库pillow处理图像

入门知识 颜色。如果你有使用颜料画画的经历&#xff0c;那么一定知道混合红、黄、蓝三种颜料可以得到其他的颜色&#xff0c;事实上这三种颜色就是美术中的三原色&#xff0c;它们是不能再分解的基本颜色。在计算机中&#xff0c;我们可以将红、绿、蓝三种色光以不同的比例叠加…

腾讯云云监控实践:使用云审计 CloudAudit SDK 精准管理腾讯云资源

文章目录 一、什么是腾讯云的操作审计 CloudAudit二、CloudAudit 有哪些优势三、CloudAudit 应用场景举例3.1 安全分析3.2 资源变更跟踪3.3 合规性审计 四、使用云审计 SDK 进行云监控4.1 安装环境包 PHP4.2 下载并解压云审计 PHP SDK4.3 创建的腾讯云持久证书&#xff08;如果…

【添加公众号】CSDN官方指定推广功能

一、场景 二、说明 三、要求&#xff08;其中之一&#xff09; 三、实战 Stage 1&#xff1a;进入推广管理 Stage 2&#xff1a;申请推广 1、微信公众号推广 2、微信号推广 Stage 3&#xff1a;提交审核 Stage 4&#xff1a;查看结果 Stage 5&#xff1a;开启推广 S…

深度学习与神经网络pytorch版 2.3 线性代数

深度学习与神经网络pytorch版 2.3 线性代数 目录 深度学习与神经网络pytorch版 2.3 线性代数 1. 简介 2. 线性代数 2.3.1 标量 ​编辑2.3.2 向量 2.3.3 矩阵 2.3.4 张量及其性质 2.3.5 降维 2.3.6 非降维求和 2.3.7 点积 2.3.8 矩阵-向量积 2.3.9 矩阵-矩阵乘法 …

linux平台 LED情报板网关项目总结

LED情报板目前已经基本稳定 主要存在两个版本LED1.5 和LED2 两个版本的主要差别是 &#xff1a; 1.1.5的配置文件存在本地 2.0的存在平台 需要通过接口从平台获取 2.1.5的下发消息的时候需要同步返回 2.0的是异步返回&#xff0c;所以1.5的要尽可能完成 不然会导致发 布平台…

境外投资企业备案结果公开名录列表数据

境外投资企业备案结果公开名录列表数据 1、时间&#xff1a;更新至2023年10月16日 2、指标&#xff1a;境外投资企业_机构、境内投资者名称、投资国别地区 3、来源&#xff1a;商务部 4、指标解释 境外投资企业&#xff08;机构&#xff09;备案结果公开名录列表&#xff…

SpringBoot 结合 liteflow 规则引擎使用

1、前言 在日常的开发过程中&#xff0c;经常会遇到一些串行或者并行的业务流程问题&#xff0c;而业务之间不必存在相关性。 在这样的场景下&#xff0c;使用策略和模板模式的结合可以很好的解决这个问题&#xff0c;但是使用编码的方式会使得文件太多,在业务的部分环节可以…

LabVIEW扫频阻抗测试系统

实现扫频阻抗法用于检测变压器绕组变形&#xff0c;结合了短路阻抗法和频响法的优点&#xff0c;但受限于硬件精度&#xff0c;尤其是50 Hz短路阻抗测试存在稳定性和准确性的问题。通过LabVIEW编程&#xff0c;控制宽频带信号发生器和高速采集卡&#xff0c;提高测试结果的稳定…

【论文阅读|细胞实例分割算法ASF-YOLO】

论文题目&#xff1a;ASF-YOLO: A novel YOLO model with attentional scale sequence fusion for cell instance segmentation 论文链接&#xff1a; https://arxiv.org/abs/2312.06458 代码链接&#xff1a;https://github.com/mkang315/ASF-YOLO 摘要&#xff08;Abstract&a…

C++(6) 继承

文章目录 继承1. 继承1.1 什么是继承1.2 C 继承方式1.2.1 基本案例1.2.2 继承权限组合1.2.3 继承中构造函数的说法1.2.4 继承中析构函数的执行顺序1.2.5 继承中变量名称冲突问题1.2.6 继承中函数【重写】 继承 1. 继承 1.1 什么是继承 面向对象程序设计中最重要的一个概念是继…