首页
学习
活动
专区
圈层
工具
发布
37 篇文章
1
【愚公系列】软考中级-软件设计师 001-计算机系统知识(考点简介)
2
【愚公系列】软考中级-软件设计师 002-计算机系统知识(CPU)
3
【愚公系列】软考中级-软件设计师 003-计算机系统知识(进制转换)
4
【愚公系列】软考中级-软件设计师 004-计算机系统知识(数据的表示)
5
【愚公系列】软考中级-软件设计师 005-计算机系统知识(校验码)
6
【愚公系列】软考中级-软件设计师 006-计算机系统知识(存储系统)
7
【愚公系列】软考中级-软件设计师 007-计算机系统知识(输入输出技术)
8
【愚公系列】软考中级-软件设计师 008-计算机系统知识(计算机体系结构)
9
【愚公系列】软考中级-软件设计师 009-计算机系统知识(总线)
10
【愚公系列】软考中级-软件设计师 010-计算机系统知识(加密技术和认证技术)
11
【愚公系列】软考中级-软件设计师 011-程序设计语言基础知识(考点简介)
12
【愚公系列】软考中级-软件设计师 012-程序设计语言基础知识(概述)
13
【愚公系列】软考中级-软件设计师 013-程序设计语言基础知识(语言处理程序基础)
14
【愚公系列】软考中级-软件设计师 014-数据结构(考点简介)
15
【愚公系列】软考中级-软件设计师 015-数据结构(线性结构)
16
【愚公系列】软考中级-软件设计师 016-数据结构(数组、矩阵和广义表)
17
【愚公系列】软考中级-软件设计师 017-数据结构(树和二叉树概念)
18
【愚公系列】软考中级-软件设计师 018-数据结构(二叉树的分类)
19
【愚公系列】软考中级-软件设计师 019-数据结构(树和森林)
20
【愚公系列】软考中级-软件设计师 020-数据结构(图)
21
【愚公系列】软考中级-软件设计师 021-数据结构(查找算法)
22
【愚公系列】软考中级-软件设计师 022-数据结构(排序算法)
23
【愚公系列】软考中级-软件设计师 023-操作系统(考点简介)
24
【愚公系列】软考中级-软件设计师 024-操作系统(操作系统概述)
25
【愚公系列】软考中级-软件设计师 025-操作系统(进程管理-状态管理和前趋图)
26
【愚公系列】软考中级-软件设计师 026-操作系统(进程管理-信号量PV操作)
27
【愚公系列】软考中级-软件设计师 027-操作系统(进程管理-银行家算法和线程)
28
【愚公系列】软考中级-软件设计师 028-操作系统(存储管理-页式存储)
29
【愚公系列】软考中级-软件设计师 029-操作系统(段式存储和段页式存储)
30
【愚公系列】软考中级-软件设计师 030-操作系统(设备管理)
31
【愚公系列】软考中级-软件设计师 031-操作系统(文件管理)
32
【愚公系列】软考中级-软件设计师 032-操作系统(作业管理)
33
【愚公系列】软考中级-软件设计师 033-软件工程基础(考点简介)
34
【愚公系列】软考中级-软件设计师 034-软件工程基础(概述)
35
【愚公系列】软考中级-软件设计师 035-软件工程基础(过程模型)
36
【愚公系列】软考中级-软件设计师 036-软件工程基础(需求分析)
37
【愚公系列】软考中级-软件设计师 037-软件工程基础(系统设计)

【愚公系列】软考中级-软件设计师 015-数据结构(线性结构)

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2023年华为云十佳博主,2022年CSDN博客之星TOP2,2022年华为云十佳博主等。

🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。

🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

线性结构是指数据元素之间存在一对一的关系,即除了第一个和最后一个数据元素之外,其他数据元素都只有一个直接前驱和一个直接后继。线性结构包括以下几种:

  1. 数组(Array):一组连续的内存空间来存储相同类型的数据元素,通过下标访问元素。
  2. 链表(Linked List):由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。
  3. 栈(Stack):一种特殊的线性表,只能在表的一端进行插入和删除操作,遵循先进后出(LIFO)的原则。
  4. 队列(Queue):一种特殊的线性表,只能在表的一端进行插入操作(队尾),在表的另一端进行删除操作(队头),遵循先进先出(FIFO)的原则。
  5. 双向链表(Doubly Linked List):每个节点包含数据域和指向前一个节点和后一个节点的指针。
  6. 循环链表(Circular Linked List):最后一个节点的指针指向第一个节点,形成一个闭环。

🚀一、线性结构

🔎1.概念

线性结构是指每个元素最多只有一个出度和一个入度,表现为一条线状。线性表是一种特殊的线性结构分为顺序表和链表。

  • 顺序表:顺序表是使用一段连续的存储空间来存储线性表的元素,可以通过下标直接访问元素。顺序表的特点是插入和删除操作较慢,但是随机访问元素的效率较高。
  • 链表:链表是通过一系列的节点来存储线性表的元素,每个节点包含数据域和指向下一个节点的指针。链表的特点是插入和删除操作较快,但是随机访问元素的效率较低。

在线性结构中,除了顺序表和链表,还有一些其他的线性结构,如栈和队列。栈是一种特殊的线性表,只能在表的一端进行插入和删除操作,遵循先进后出(LIFO)的原则。队列也是一种特殊的线性表,只能在表的一端进行插入操作(队尾),在表的另一端进行删除操作(队头),遵循先进先出(FIFO)的原则。

线性结构中元素在计算机内存中的存储方式,主要有顺序存储和链式存储两种方式。

  • 顺序存储:顺序存储是将线性表中的元素依次存储在一组地址连续的存储单元中,使得逻辑上相邻的元素在物理上也相邻。顺序存储的特点是通过元素的下标可以直接访问元素,因此查找效率高。插入和删除元素时需要移动其他元素,效率较低。
  • 链式存储:链式存储是通过存储各数据元素的结点的地址来实现元素的存储,每个结点包含数据域和指向下一个结点的指针。链式存储的特点是插入和删除元素时只需要修改指针,不需要移动其他元素,因此效率较高。但是链式存储无法直接访问中间的元素,需要从头节点开始顺序遍历。

🔎2.顺序存储和链式存储区别

在空间方面,链表需要额外存储指针,导致空间浪费。

在时间方面:

  • 链表在插入和删除元素时效率更高,因为只需要修改指针指向,而顺序表因为地址连续,插入或删除元素后需要移动其他节点。
  • 在读取和查找元素时,顺序表效率更高,因为物理地址连续,可以通过索引快速定位,而链表需要从头节点开始逐个查找。🔎2.单链表的插入和删除

在上图中p所指向的节点后插入s所指向的节点,操作为:

代码语言:clike
复制
s->next=p->next;
p->next=s;

在单链表中删除p所指向节点的后继节点q时,操作为:

代码语言:clike
复制
p->next=p->next->next;
free(q);

🔎3.栈和队列

栈、队列和循环队列是常见的数据结构,用于存储和操作数据。

  1. 栈(Stack)是一种后进先出(Last In First Out,LIFO)的数据结构。它只允许在栈的一端进行插入和删除操作,这一端称为栈顶。栈的常用操作有入栈(push)、出栈(pop)和获取栈顶元素(top)。栈可以用数组或链表实现。
  2. 队列(Queue)是一种先进先出(First In First Out,FIFO)的数据结构。它允许在队列的一端(队尾)插入新元素,而在另一端(队头)删除元素。队列的常用操作有入队(enqueue)、出队(dequeue)和获取队头元素(front)。队列可以使用数组或链表实现。
  3. 循环队列(Circular Queue)是一种具有固定大小的队列,它可以像队列一样先进先出,但是它的队尾和队头是相连的。当队尾到达数组的末尾时,它可以循环回到数组的开头。循环队列的常用操作有入队(enqueue)、出队(dequeue)和获取队头元素(front)。循环队列可以使用数组实现,通过维护两个指针(队头和队尾的索引)来实现循环。

在循环队列中,头指针指向第一个元素,尾指针指向最后一个元素的下一个位置。当队列为空时,头尾指针相等;当队列满时,头尾指针也相等,无法区分。因此,一般会将队列空出一个元素位置,这样队列满的条件就是尾指针的下一个位置等于头指针。考虑到循环队列特性,需要使用最大元素数取余运算来实现循环,即(tail + 1) % size = head。循环队列的长度可以通过(Q.tail - Q.head) % size公式得到。另外,优先队列是一种特殊的队列,其中的元素被赋予了优先级。在访问元素时,具有最高优先级的元素最先被删除。优先队列常使用堆来存储元素,因为堆的顺序不是按照元素在队列中的顺序来决定的。

🔎4.串

🦋4.1 串的定义

术语

定义

空串

长度为0的字符串,没有任何字符。

空格串

由一个或多个空格组成的串,空格是空白字符,占一个字符长度。

子串

串中任意长度的连续字符构成的序列称为子串。含有子串的串称为主串,空串是任意串的子串。

🦋4.2 串的匹配

算法

定义

模式匹配算法

子串的定位操作,用于查找子串在主串中第一次出现的位置的算法。

基本的模式匹配算法

也称为布鲁特一福斯算法,其基本思想是从主串的第1个字符起与模式串的第1个字符比较,若相等,则继续逐个字符进行后续的比较;否则从主串中的第2个字符起与模式串的第1个字符重新比较,直至模式串中每个字符依次和主串中的一个连续的字符序列相等时为止,此时称为匹配成功,否则称为匹配失败。

KMP算法

对基本模式匹配算法的改进,其改进之处在于:每当匹配过程中出现相比较的字符不相等时,不需要回溯主串的字符位置指针,而是利用已经得到的“部分匹配”结果将模式串向右“滑动”尽可能远的距离,再继续进行比较。

KMP算法相比于基本的模式匹配算法差别:

  • 基本的模式匹配算法:匹配失败从第二位开始继续
  • KMP算法:匹配失败从失败位置开始继续

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

下一篇
举报
领券