4-数据结构-串的学习

4.1串类型的定义

1.串:(或字符串)

串是由多个字符组成的有限序列,记作:S=‘c1c2c3…cn’ (n>0)

其中S是串的名字,‘c1c2c3…cn’ 是串值
ci是串中字符
n是串的长度,表示字符的数目

空串:零个字符的串称为空串,记作“”(空)

2.子串

子串:串中任意连续字符组成的子序列
主串:包含子串的串

注意:空串是任意串的子串,任意串是他自身的子串。除它本身外,一个串的其他子串都是它的真子串

*字符在串中的位置:字符在序列中的序号
*子串在串中的位置:子串的第一个字符在子串中的位置

3.串相等

两个串长度相等且各个对应位置的字符串都相等时才相等

4.空格串

由一个或多个空格组成的串,长度不为0

【串和线性表的区别:
1:数据对象:串的约束对象为字符集
2 串的操作:线性表大多以“单个元素”为操作对象;串通常以“串的整体”作为操作对象

4.2.1串的表示和实现

【1.定长顺序存储表示
*静态分配:为每个串预先分配一个固定长度的存储区域

*用定长数组描述
#define MAXSTRLEN 255 //最大串长
typedef unsigned char SString[MAXSTRLEN+1]
// +1个单元为 0号单元存放串的长度

【图】在这里插入图片描述

【串的连接:

status Concat(SSting&T,SString S!,SString S2)
{//用T返回由S1和S2连接而成的新串。若未截断,则返回TURE,否则返回FALSEif(S1[0]+S2[0]<=MAXSTRLEN)\
{//未截断T[1,...,S1[10]]=S1[1,....S1[0]];       //S1[0]表示S1的0号单元,里面是串的长度  T[S1[0]+1,...,S2[0]+S2[0]];T[0]=S1[0]+S2[0];   //长度之和uncut=TURE;   //未截断
}else if(S1[0]<MAXSTRSIZE) 
{//截断T[1,...,S1[10]]=S1[1,....S1[0]];      T[S1[0]+1,...,MAXSTRLEN]=S2[1,...,MAXSTRLEN-S1[0] ];    //装不下,只截取了S2的一部分T[0]=MAXSTRLEN;  uncut=FALSE;  
}return uncat;
} //Concat
}

【求子串:

status SubString(SString &Sub,SString S,int pos,int len)
{//用sub返回串的第pos个字符起长度为len的子串//其中,1<=pos<=StrLength(S) 且0<=len<=StrLength(S)-pos+1if (pos<1||pos>S[0]||len<0||len>S[0]-pos+1)return ERROR;   //不合法Sub[1..len]=S[pos..pos+len-1];   //从S的第pos位置开始,取长度为len的子串
Sub[0]=len;    //子串的长度
return OK;}

【总结:
操作特点:
1.实现串操作特点的原操作为:“字符序列的复制”
2.在操作中当出现串的长度超过MAXSTRLEN时,约定用截断法处理

4.2.2串的表示和实现

2.堆分配存储表示

动态分配

仍以一组地址连续的存储单元存放串值字符序列,但存储空间是在程序执行过程中动态分配而得的,也称为【动态存储分配的顺序表】。用malloc()和free()来分配和释放

堆分配的存储表示
typedef struct 
{char *ch;    //地址指向存储空间 按需分配//若是非空串,则按串实用长度分配存储区,否则ch为NULLint lentgh;   //串长度} HString;    
串插入
status strInsert(HString &S,int pos,HString T)
//在串S的第pos个位置前插入串T
{ int i;if(pos<1||pos>S.length+1)    //判断合法范围return ERROR;if(T.length)            //判断是否为0{if(!(S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char))))    //S和T的长度之和exit(OVERFLOW);    //分配失败溢出for(i=S.length-1;i>=pos-1;--1)     //length-1是节点序数,因为长度有一个0节点{ S.ch[i+T.length]=S.ch[i];}for(i=0;i<=T.length-1;i++)S.ch[pos-1+i]=T.ch[i];S.length+=T.length;}return OK;
}
求串长

int StrLength(HString S)
//求串长
{return S.length
}
串比较

int StrCompare(HString S,HString T)
//比较两个串,若相等返回0
{int i;for (i=0;i<S.length && i<T.length; i++)if (S.ch[i]!=T.ch[i])return S.ch[i]-T.ch[i];return S.length-T.length;
}
串清空
status ClearString(HString &S)
//将S清空为空串
{if(S.ch){free(S.ch);S.ch=NULL;}S.length=0;return OK;
}
串连接
status Concat(HString &S,HString S1,HString S2){
int j;
if(!(S.ch=(char*)malloc((S1.length+S2.length)*sizeof(char))))exit(OVERFLOW);
for (j=0;j<=S1.length-1;j++){S.length=S1.length+S2.length;}
for(j=0;j<=S2.length-1;j++){  S.ch[S1.length+j]=S2.ch[j];}
return OK;
}
求子串
status StubString(HString &Sub,HString S,int pos,int len)
// 用Sub返回串S的dipos个字符开始长度为len的子串
{if(pos<1||pos>S.length||len<0||len>S.length-pos+1)return ERROR;if(!len) {Sub.cn=NULL;Sub.length=0;}else{sub.ch=(char*)malloc(len*sizeof(char));for(int j=0;j<=len-1;j++){Sub.ch[j]=S.ch[pos-1+j];}
Sub.length=len;
}
return OK;

4.3串的模式匹配算法

4.3.1 BF算法
模式匹配:

在这里插入图片描述
在这里插入图片描述

算法:
int Index(SString S,SString T,int pos)
{
i=pos;j=1;
while(i<=S[0]&&j<=T[0])  //判断合法范围{if(S[i]==T[j]) {++i;++j;}else{i=i-j+2; j=1;}}
if(j>T[0])  return i-T[0];
else return 0;
}
时间复杂度:

最好情况:
在这里插入图片描述
最坏情况:
在这里插入图片描述

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

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

相关文章

5-数据结构-数组的学习

5.1数组的定义 定义&#xff1a; 由一组类型相同的数据元素构成的有序集合&#xff0c;每个数据元素称为一个数据元素&#xff08;简称元素&#xff09;&#xff0c;每个元素受n&#xff08;n>1&#xff09;个线性关系的约束&#xff0c;每个元素在n个线性关系中的序号i1、…

timm 视觉库中的 create_model 函数详解

timm 视觉库中的 create_model 函数详解 最近一年 Vision Transformer 及其相关改进的工作层出不穷&#xff0c;在他们开源的代码中&#xff0c;大部分都用到了这样一个库&#xff1a;timm。各位炼丹师应该已经想必已经对其无比熟悉了&#xff0c;本文将介绍其中最关键的函数之…

C--数据结构--树的学习

6.2.1二叉树的性质 1.二叉树 性质&#xff1a; 1.若二叉树的层次从1开始&#xff0c;则在二叉树的第i层最多有2^(i-1)个结点 2.深度为k的二叉树最多有2^k -1个结点 &#xff08;k>1&#xff09; 3.对任何一颗二叉树&#xff0c;如果其叶结点个数为n0,度为2的非叶结点个数…

C语言—sort函数比较大小的快捷使用--algorithm头文件下

sort函数 一般情况下要将一组数从的大到小排序或从小到大排序&#xff0c;要定义一个新的函数排序。 而我们也可以直接使用在函数下的sort函数&#xff0c;只需加上头文件&#xff1a; #include<algorithm> using namespace std;sort格式&#xff1a;sort(首元素地址&…

AI编译器与传统编译器的联系与区别

AI编译器与传统编译器的区别与联系 总结整理自知乎问题 针对神经网络的编译器和传统编译器的区别和联系是什么&#xff1f;。 文中提到的答主的知乎主页&#xff1a;金雪锋、杨军、蓝色、SunnyCase、贝壳与知了、工藤福尔摩 笔者本人理解 为了不用直接手写机器码&#xff0…

python学习1:注释\变量类型\转换函数\转义字符\运算符

python基础学习 与大多数语言不同&#xff0c;python最具特色的就是使用缩进来表示代码块&#xff0c;不需要使用大括号 {} 。缩进的空格数是可变的&#xff0c;但是同一个代码块的语句必须包含相同的缩进空格数。 &#xff08;一个tab4个空格&#xff09; Python语言中常见的…

python 学习2 /输入/ 输出 /列表 /字典

python基础学习第二天 输入输出 xinput("输入内容") print(x)input输出&#xff1a; eval :去掉字符串外围的引号&#xff0c;按照python的语法执行内容 aeval(12) print(a)eval输出样式&#xff1a; 列表 建立&#xff0c;添加&#xff0c;插入&#xff0c;删去…

快速排序 C++

快速排序 C 本文图示借鉴自清华大学邓俊辉老师数据结构课程。 快速排序的思想 快速排序是分治思想的典型应用。该排序算法可以原地实现&#xff0c;即空间复杂度为 O(1)O(1)O(1)&#xff0c;而时间复杂度为 O(nlogn)O(nlogn)O(nlogn) 。 算法将待排序的序列 SSS 分为两个子…

llvm与gcc

llvm与gcc llvm 是一个编译器&#xff0c;也是一个编译器架构&#xff0c;是一系列编译工具&#xff0c;也是一个编译器工具链&#xff0c;开源 C11 实现。 gcc 相对于 clang 的优势&#xff1a; gcc 支持更过语言前端&#xff0c;如 Java, Ada, FORTRAN, Go等gcc 支持更多地 …

攻防世界web新手区解题 view_source / robots / backup

1**. view_source** 题目描述&#xff1a;X老师让小宁同学查看一个网页的源代码&#xff0c;但小宁同学发现鼠标右键好像不管用了。 f12查看源码即可发现flag 2. robots 题目描述&#xff1a;X老师上课讲了Robots协议&#xff0c;小宁同学却上课打了瞌睡&#xff0c;赶紧来教教…

听GPT 讲Rust源代码--src/tools(25)

File: rust/src/tools/clippy/clippy_lints/src/methods/suspicious_command_arg_space.rs 在Rust源代码中&#xff0c;suspicious_command_arg_space.rs文件位于clippy_lints工具包的methods目录下&#xff0c;用于实现Clippy lint SUSPICIOUS_COMMAND_ARG_SPACE。 Clippy是Ru…

Java一次编译,到处运行是如何实现的

Java一次编译&#xff0c;到处运行是如何实现的 转自&#xff1a;https://cloud.tencent.com/developer/article/1415194 &#xff08;排版微调&#xff09; JAVA编译运行总览 Java是一种高级语言&#xff0c;要让计算机执行你撰写的Java程序&#xff0c;也得通过编译程序的…

攻防世界web新手区解题 /cookie / disabled_button / weak_auth

cookie 题目描述&#xff1a;X老师告诉小宁他在cookie里放了些东西&#xff0c;小宁疑惑地想&#xff1a;‘这是夹心饼干的意思吗&#xff1f;’ 使用burp suite抓包查看 发现提示&#xff1a; look-herecookie.php 于是在url后加上 cookie.php 得到提示查看返回 就得到了f…

基于GET报错的sql注入,sqli-lab 1~4

根据注入类型可将sql注入分为两类&#xff1a;数字型和字符型 例如&#xff1a; 数字型&#xff1a; sleect * from table where if 用户输入id 字符型&#xff1a;select * from table where id 用户输入id &#xff08;有引号) 通过URL中修改对应的D值&#xff0c;为正常数字…

xss原理和注入类型

XSS漏洞原理 : XSS又叫CSS(cross Site Script), 跨站脚本攻击,指的是恶意攻击者往Web页面里插入恶意JS代码,当用户浏览该页时,嵌入其中的Web里的JS代码就会被执行,从而达到恶意的特殊目的. 比如:拿到cooike XSS漏洞分类: 反射性(非存储型) payload没有经过存储,后端接收后,直接…

存储型xss案例

存储型xss原理: 攻击者在页面插入xss代码,服务端将数据存入数据库,当用户访问存在xss漏洞的页面时,服务端从数据库取出数据展示到页面上,导致xss代码执行,达到攻击效果 案例: 在一个搭建的论坛网站中, 根据存储型xss注入的条件,要找到可以存储到数据库的输入位置,并且这个位置…

反射型XSS案例

**原理:**攻击者将url中插入xss代码,服务端将url中的xss代码输出到页面上,攻击者将带有xss代码的url发送给用户,用户打开后受到xss攻击 需要url中有可以修改的参数 案例: 可能存在反射型xss的功能(点) : 搜索框等&#xff08;所有url会出现参数的地方都可以尝试&#xff09;……

xss-lab靶场通关writeup(1~6.......在更新)

level 2 : 标签被编码&#xff0c;利用属性完成弹窗 输入 发现没有弹窗 查看源代码&#xff1a; 发现&#xff1a; <>符号被编码 说明keybord参数进行了处理&#xff0c;那么只能从属性上进行恶意编码&#xff1a;先将属性的引号和标签闭合&#xff0c;用 // 将后面的…

PyTorch 分布式训练DDP 单机多卡快速上手

PyTorch 分布式训练DDP 单机多卡快速上手 本文旨在帮助新人快速上手最有效的 PyTorch 单机多卡训练&#xff0c;对于 PyTorch 分布式训练的理论介绍、多方案对比&#xff0c;本文不做详细介绍&#xff0c;有兴趣的读者可参考&#xff1a; [分布式训练] 单机多卡的正确打开方式…

Linux free 命令详解

Linux free 命令详解 free 命令用来查看系统中已用的和可用的内存。 命令选项及输出简介 关于各种命令的功能和命令选项&#xff0c;还是推荐英语比较好的同学直接看手册 RTFM&#xff1a;man free。这里简单总结一下一些重点&#xff1a; 功能及输出简介 free 命令显示系…