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;
}
时间复杂度:
最好情况:
最坏情况:
4-数据结构-串的学习相关推荐
- 数据结构与算法 学习笔记(5):字符串
数据结构与算法 学习笔记(5)- 字符串 本次笔记记录了LeetCode中关于字符串的一些问题,并给出了相应的思路说明和代码.题目编号与LeetCode对应,方便查找. 题目1:LeetCode 13 ...
- 数据结构与算法学习⑥(动态规划 题解 背包和打家劫舍问题)
数据结构与算法学习⑥(动态规划 动态规划 1.初识动态规划 1.1.从贪心说起 1.1.1.贪心的特点 1.1.2.贪心的局限性 1.1.3.贪心失效后怎么办 1.1.4.从最优化问题到递归 1.2. ...
- c语言将AOE网络的数据写入TXT文档中,数据结构与算法学习辅导及习题详解.张乃孝版-C/C++文档类资源...
数据结构与算法学习辅导及习题详解.张乃孝版.04年10月 经过几年的努力,我深深体会到,编写这种辅导书要比编写一本湝通教材困难得多. 但愿我的上述理想,在本书中能够得以体现. 本书的组织 本书继承了& ...
- java中的数据结构之HashMap学习
java中的数据结构之HashMap学习 equal与hashcode equals与hashcode的源码 为什么hashmap中作为键值的类要重写hashcode和equals方法 Integer ...
- 数据结构第二章学习总结
数据结构第二章学习总结 在数据结构第二章,我们学习了线性表的两种结构顺序和链式结构,学习了他们的定义,不同,存储结构和逻辑结构,还有一些基本的操作. 在学习过程中,我发现了许多问题:①书上的大多数代码 ...
- 数据结构与算法学习笔记之 从0编号的数组
数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...
- python leetcode_leetcode 介绍和 python 数据结构与算法学习资料
for (刚入门的编程)的高中 or 大学生 leetcode 介绍 leetcode 可以说是 cs 最核心的一门"课程"了,虽然不是大学开设的,但基本上每一个现代的高水平的程序 ...
- 七桥问题c语言程序数据结构,数据结构与算法学习——图论
什么是图? 在计算机程序设计中,图结构也是一种非常常见的数据结构 但是图论其实是一个非常大的话题 图结构是一种与树结构有些相似的数据结构 图论是数学的一个分支,并且在数学概念上,树是图的一种 它以图为 ...
- 数据结构与算法学习笔记之 提高读取性能的链表(上)
数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...
- 邓俊辉《数据结构》-列表学习笔记
2021.12.9 向量&列表的关系 向量结构中各数据项的物理存放位置与逻辑次序完全对应,可通过秩直接访问对应的元素,即"循秩访问".好像可以通过一个人的家庭住址找到那个人 ...
最新文章
- leetcode374. 猜数字大小
- tensorflow实战学习笔记(1)
- [转载] Python类属性、类方法和静态方法
- iOS推送机制下AppDelegate中代理函数执行顺序
- Android入门笔记03
- Python SVM手写数字识别
- 苹果手机铃声制作教程
- IOT:基于oblog的应用
- USACO 1.1.2 - Greedy Gift Givers(模拟)
- 快速正确的搭建一个微服务架构需要了解的那几个点
- python爬取公众号阅读量_分享一个牛逼的Python项目:公众号文章爬虫
- 布署LAMP环境(分离部署)
- redhat 下 oracle 10G RAC 集群 详细安装
- python人脸头发身体部位识别人数统计
- pc端客户端爬虫_FIddler+Proxifer工具对windows PC客户端进行抓包
- git重新生成ssh密钥
- 微宝自动更新影视源码全解
- 在ubuntu中进行简单截屏、专业截屏、自定义截屏操作
- RIB表与FIB表、ARP表与FDB表
- 产品思考 - 小米的机会
热门文章
- RabbitMQ+haproxy+keeplived 高可用负载均衡+镜像集群模式_集成负载均衡组件 Ha-Proxy_02
- 实战_01_Spring SpringMVC 整合Mybaits
- 不太平凡的2020、平凡的我
- bootstrap table 列拖动变宽
- 计算机网络按照延伸距离划分为,大学计算机考试练习题.doc
- 2020计算机语言排行 rust,RedMonk 2020 年 Q3 编程语言排行:Rust 首次进入前 20
- yum安装mysql5.7 简书_阿里云服务器(centos7.3)上安装jdk、tomcat、mysql、redis
- python导入同一文件夹下的类_python自定义模块
- java解压zip异常_java解压zip文件示例
- java 8 optional 类,Java8新特性-Optional类