数据结构学习 --4 串

数据结构学习 --1 绪论
数据结构学习 --2 线性表
数据结构学习 --3 栈,队列和数组
数据结构学习 --4 串
数据结构学习 --5 树和二叉树
数据结构学习 --6 图
数据结构学习 --7 查找
数据结构学习 --8 排序

本人学习记录使用 希望对大家帮助 不当之处希望大家帮忙纠正

数据结构学习 --4 串

在这里插入图片描述


文章目录

  • 4.1 串的定义和实现
    • 4.1.1 串的定义
    • 4.1.2 串的存储结构
    • 4.1.3 串的基本操作
  • 4.2 串的模式匹配
    • 4.2.1 简单的模式匹配算法
    • 4.2.2 串的模式匹配算法KMP 算法


4.1 串的定义和实现

字符串简称串,计算机上非数值处理的对象基本都是字符串数据。我们常见的信息检索系统(如搜索引擎) 文本编辑程序 (如 Word)问答系统、自然语言翻译系统等, 都是符数据作为处理对象的。

4.1.1 串的定义

串(string) 是有零个或多个字符组成的有限序列
一般记为

S='A1,A2,A3,AN'(N>=0);

其中,S 是串名,单引号括起来的字符序列是串的值,a1可以是字母 数字 或者其他字符;串中字符的个数n 称为串的长度。n=0时的串称为空串

串的逻辑结构和线性表极为相似,区别仅在于串的数据对象限定为字符集。在基本操作上,串和线性表有很大差别。线性表的基本操作主要以单个元素作为操作对象,如查找、插入或删除某个元素等:而串的基本操作通常以子串作为操作对象,如查找、插入或删除一个子串等

4.1.2 串的存储结构

  1. 定长顺序存储表示
    类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。在串的定长顺序存储结构中,为每个串变量分配一个固定长度的存储区,即定长数组。
#define MAXLEN 255 //预定义最大串长为255
typedef struct{ //每个分量存储一个字符char ch[MAXLEN]; int length;//串的实际长度
}SString;

串的实际长度只能小于或等于
MAXLEN,超过预定义长度的串值会被舍去,称为截断。串长有两种表示方法:一是如上述定义描述的那样,用一个额外的变量 len来存放串的长度;二是在串值后面加一个不计入串长的结束标记字符“\0”,此时的串长为隐含值。
在一些串的操作(如插入、联接等)中,若串值序列的长度超过上界MAXLEN,约定用“截断”法处理,要克服这种弊端,只能不限定串长的最大长度,即采用动态分配的方式。

  1. 堆分配存储表示
    堆分配存储表示仍然以一组地址连续的存储单元存放串值的字符序列,但它们的存储空间是在程序执行过程中动态分配得到的。
typedef struct{char *ch; //按串长分配存储区,ch 指向串的基地址int length; //串的长度
}HString;

在C语言中,存在一个称之为“堆”的自由存储区,并用malloc()和free()函数来完成动态存储管理。利用malloc()为每个新产生的串分配一块实际串长所需的存储空间,若分配成功,则返回一个指向起始地址的指针,作为串的基地址,这个串由
ch 指针来指示;若分配失败,则返回NULL。已分配的空间可用free()释放掉。
上述两种存储表示通常为高级程序设计语言所采用。块链存储表示仅做简单介绍。

  1. 块链存储表示
    类似于线性表的链式存储结构,也可采用链表方式存储串值。由于串的特殊性(每个元素只有一个字符),在具体实现时,每个结点既可以存放一个字符,也可以存放多个字符。每个结点称为块,整个链表称为块链结构

4.1.3 串的基本操作

StrAssign(&T,chars) :赋值操作。把串赋值为chars
StrCopy(&T,S) :赋值操作,由串S复制得到串T。
StrEmpty(S) :判空操作。若S为空串返回 true ,否则false
StrCompare(S,T) :比较操作。若S>T ,则返回值>0,若S=T,则返回值=0若S<T,则返回值<0;
Strlength(S) 求串长。返回串S的元素个数
Substring(&Sub,S,pos,len):求子串。用Sub 返串s的第pos 个字符起长度为len的子串。
Concat(&T,S1,S2):串联接。用T返回由S1和S2联接而成的新串。Index(S,T):定位操作。若主串 s 中存在与串T值相同的子串,则返回它在主串 S中第一次出现的位置;否则函数值为 0clearString(&S):清空操作。将s清为空串
DestroyString(&S):销毁串。将串S销毁

不同的高级语言对串的基本操作集可以有不同的定义方法。在上述定义的操作中,串赋值strAssign串比较StrCompare、求串长StrLength 串联接Concat 及求子串 Substring五种操作构成串类型的最小操作子集,即这些操作不可能利用其他串操作来实现:反之,其他串操作(除串清除ClearString和串销毁 Destroystring外)均可在该最小操作子集上实现。

4.2 串的模式匹配

4.2.1 简单的模式匹配算法

子串的定位操作通常称为串的模式匹配,它求的是子串(常称模式串)在主串中的位置。这里采用定长顺序存储结构,给出一种不依赖于其他串操作的爆破匹配算法。

int Index(SString S,SString T){int i=1,j=1;while(i<S.length && j< T.length){if(S.ch[i] == T.ch[j]){++i;++j;  //继续比较后继字符}else{i = i-j+2; j=1 //指针后退重新开始匹配}if(j>T.length) return i-T.length;else return 0;} 
}

4.2.2 串的模式匹配算法KMP 算法

  1. 字符串的前缀 后缀 和部分匹配值

要了解子串的结构,首先要弄清楚几个概念:前缀、后缀和部分匹配值。前缀指除最后一个字符以外,字符串的所有头部子串;后缀指除第一个字符外,字符串的所有尾部子串;部分匹配值则为字符串的前缀和后缀的最长相等前后缀长度。

void get_nextval(SString T,int nextval[]){int i=1,j=0;nextval[1]=0;while(i<T.length)(if(j==0 || T.ch[i]==T.ch[j]){++i,++j;if(T.ch[i]!=T.ch[j]) nextval[i]=j;else  nextval[i]=nextval[j];}else j=nextval[j];}
}		

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

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

相关文章

2023年最新 Github Pages 使用手册

参考&#xff1a;GitHub Pages 快速入门 1、什么是 Github Pages GitHub Pages 是一项静态站点托管服务&#xff0c;它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件&#xff0c;&#xff08;可选&#xff09;通过构建过程运行文件&#xff0c;然后发布网站。 可…

习题练习 C语言(暑期第三弹)

自我小提升&#xff01; 前言一、存储地址二、逗号表达式三、除自身以外数组的乘积四、字节与二进制五、符号计算六、不用加减乘除做加法七、unsigned判断八、移位计算九、sizeof宏十、移位计算十一、移位计算十二、优先级判断十三、单词倒排总结 前言 重要的事说三遍&#xf…

人员闯入检测告警算法

人员闯入检测告警算法通过yolov5网络模型识别检测算法&#xff0c;人员闯入检测告警算法对未经许可或非法进入的人员进行及时识别告警&#xff0c;确保对危险区域的安全管理和保护。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用anchor box将分类与目标定位…

博客系统——前端部分

目录 一、博客页面介绍 二、实现博客列表页 1、先实现导航栏 2、页面主体 左侧区域的实现&#xff1a;​编辑 右侧页面的实现&#xff1a;​编辑 博客列表页代码汇总&#xff1a; 三、实现博客详情页 代码实现&#xff1a; 四、实现博客登录页​编辑 五、博客编辑页 …

LEADTOOLS V22 for Python -Crack

LEAD Technologies Inc 是面向所有主要平台和编程语言的应用程序开发的人工智能 SDK 的领先提供商&#xff0c;很高兴地宣布在其最新的 LEADTOOLS 版本 22 更新中添加了完整的 Python 支持。 Python是一种动态的高级编程语言&#xff0c;广泛应用于科学计算、数据分析、人工智…

常用的css样式

1&#xff1a;flex布局 .flex-between {display: flex;justify-content: space-between; }.flex-evenly {display: flex;justify-content: space-evenly; }.flex-end {display: flex;justify-content: flex-end; }.flex {display: flex; }.flex-center {display: flex;justify…

AntDesign 自定义图片上传前端压缩画质

为什么压缩图片&#xff1f; 应为现在公司没有使用云数据库 从而为了减少服务器的消耗需要将用户上传的图片压缩 前端压缩图片的技术选择&#xff01; 查阅资料发现当下两种压缩的方法&#xff01;&#xff01;第一种使用工具库实现 npm install image-conversion --save 第…

Linux:权限

目录 一、shell运行原理 二、权限 1.权限的概念 2.文件访问权限的相关设置方法 三、常见的权限问题 1.目录权限 2.umsk(权限掩码) 3.粘滞位 一、shell运行原理 1.为什么我们不是直接访问操作系统&#xff1f; ”人“不善于直接使用操作系统如果让人直接访问操作系统&a…

qt day 1

this->setWindowIcon(QIcon("D:\\zhuomian\\wodepeizhenshi.png"));//設置窗口的iconthis->setWindowTitle("鵬哥快聊");//更改名字this->setFixedSize(500,400);//設置尺寸QLabel *qlnew QLabel(this);//創建一個標簽ql->resize(QSize(500,20…

论文笔记:从不平衡数据流中学习的综述: 分类、挑战、实证研究和可重复的实验框架

0 摘要 论文&#xff1a;A survey on learning from imbalanced data streams: taxonomy, challenges, empirical study, and reproducible experimental framework 发表&#xff1a;2023年发表在Machine Learning上。 源代码&#xff1a;https://github.com/canoalberto/imba…

Next.js基础语法

Next.js 目录结构 入口App组件&#xff08;_app.tsx&#xff09; _app.tsx是项目的入口组件&#xff0c;主要作用&#xff1a; 可以扩展自定义的布局&#xff08;Layout&#xff09;引入全局的样式文件引入Redux状态管理引入主题组件等等全局监听客户端路由的切换 ts.config…

软考:中级软件设计师:HTML

软考&#xff1a;中级软件设计师:HTML 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff…