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-数据结构-串的学习相关推荐

  1. 数据结构与算法 学习笔记(5):字符串

    数据结构与算法 学习笔记(5)- 字符串 本次笔记记录了LeetCode中关于字符串的一些问题,并给出了相应的思路说明和代码.题目编号与LeetCode对应,方便查找. 题目1:LeetCode 13 ...

  2. 数据结构与算法学习⑥(动态规划 题解 背包和打家劫舍问题)

    数据结构与算法学习⑥(动态规划 动态规划 1.初识动态规划 1.1.从贪心说起 1.1.1.贪心的特点 1.1.2.贪心的局限性 1.1.3.贪心失效后怎么办 1.1.4.从最优化问题到递归 1.2. ...

  3. c语言将AOE网络的数据写入TXT文档中,数据结构与算法学习辅导及习题详解.张乃孝版-C/C++文档类资源...

    数据结构与算法学习辅导及习题详解.张乃孝版.04年10月 经过几年的努力,我深深体会到,编写这种辅导书要比编写一本湝通教材困难得多. 但愿我的上述理想,在本书中能够得以体现. 本书的组织 本书继承了& ...

  4. java中的数据结构之HashMap学习

    java中的数据结构之HashMap学习 equal与hashcode equals与hashcode的源码 为什么hashmap中作为键值的类要重写hashcode和equals方法 Integer ...

  5. 数据结构第二章学习总结

    数据结构第二章学习总结 在数据结构第二章,我们学习了线性表的两种结构顺序和链式结构,学习了他们的定义,不同,存储结构和逻辑结构,还有一些基本的操作. 在学习过程中,我发现了许多问题:①书上的大多数代码 ...

  6. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  7. python leetcode_leetcode 介绍和 python 数据结构与算法学习资料

    for (刚入门的编程)的高中 or 大学生 leetcode 介绍 leetcode 可以说是 cs 最核心的一门"课程"了,虽然不是大学开设的,但基本上每一个现代的高水平的程序 ...

  8. 七桥问题c语言程序数据结构,数据结构与算法学习——图论

    什么是图? 在计算机程序设计中,图结构也是一种非常常见的数据结构 但是图论其实是一个非常大的话题 图结构是一种与树结构有些相似的数据结构 图论是数学的一个分支,并且在数学概念上,树是图的一种 它以图为 ...

  9. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

  10. 邓俊辉《数据结构》-列表学习笔记

    2021.12.9 向量&列表的关系 向量结构中各数据项的物理存放位置与逻辑次序完全对应,可通过秩直接访问对应的元素,即"循秩访问".好像可以通过一个人的家庭住址找到那个人 ...

最新文章

  1. leetcode374. 猜数字大小
  2. tensorflow实战学习笔记(1)
  3. [转载] Python类属性、类方法和静态方法
  4. iOS推送机制下AppDelegate中代理函数执行顺序
  5. Android入门笔记03
  6. Python SVM手写数字识别
  7. 苹果手机铃声制作教程
  8. IOT:基于oblog的应用
  9. USACO 1.1.2 - Greedy Gift Givers(模拟)
  10. 快速正确的搭建一个微服务架构需要了解的那几个点
  11. python爬取公众号阅读量_分享一个牛逼的Python项目:公众号文章爬虫
  12. 布署LAMP环境(分离部署)
  13. redhat 下 oracle 10G RAC 集群 详细安装
  14. python人脸头发身体部位识别人数统计
  15. pc端客户端爬虫_FIddler+Proxifer工具对windows PC客户端进行抓包
  16. git重新生成ssh密钥
  17. 微宝自动更新影视源码全解
  18. 在ubuntu中进行简单截屏、专业截屏、自定义截屏操作
  19. RIB表与FIB表、ARP表与FDB表
  20. 产品思考 - 小米的机会

热门文章

  1. RabbitMQ+haproxy+keeplived 高可用负载均衡+镜像集群模式_集成负载均衡组件 Ha-Proxy_02
  2. 实战_01_Spring SpringMVC 整合Mybaits
  3. 不太平凡的2020、平凡的我
  4. bootstrap table 列拖动变宽
  5. 计算机网络按照延伸距离划分为,大学计算机考试练习题.doc
  6. 2020计算机语言排行 rust,RedMonk 2020 年 Q3 编程语言排行:Rust 首次进入前 20
  7. yum安装mysql5.7 简书_阿里云服务器(centos7.3)上安装jdk、tomcat、mysql、redis
  8. python导入同一文件夹下的类_python自定义模块
  9. java解压zip异常_java解压zip文件示例
  10. java 8 optional 类,Java8新特性-Optional类