热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

串的基础知识

从数据结构角度看,栈和队列是操作受限的线性表,他们的逻辑结构相同。串是重要的非数值处理对象,它是以字符作为数据元素的线性表。串࿱
从数据结构角度看,栈和队列是操作受限的线性表,他们的逻辑结构相同。 
串是重要的非数值处理对象,它是以字符作为数据元素的线性表。 


串:即字符串,是由零个或多个字符组成的有限序列,是数据元素为单个字符的特殊线性表。 


若干术语: 
串长:串中字符个数(n≥0), n=0 时称为空串 。
空白串:由一个或多个空格符组成的串。 
字符位置:字符在串中的序号。 
串相等:串长度相等,且对应位置上字符相等。


子串:串中任意个连续的字符组成的子序列。 
主串:包含子串的串。 
子串的位置:子串的第一个字符在主串中的序号。


串的数据对象约束为某个字符集。
        微机上常用的字符集是标准ASCII码,由 7 位二进制数    表示一个字符,总共可以表示 128 个字符。扩展ASCII      码由 8 位二进制数表示一个字符,总共可以表示 256 个    字符,足够表示英语和一些特殊符号,但无法满足国际需要。  Unicode码由 16 位二进制数表示一个字符,总共可以表示2的16次方个字符,即6万5千多个字符,能够表示世界上所有语言的所有字符,包括亚洲国家的表意字符。为了保持兼容性,Unicode字符集中的前256个字符与扩展ASCII码完全相同。

ADT String {数据对象:D={ ai |ai∈CharacterSet, i=1,2,...,n, n≥0 } 数据关系:R1={ | ai-1, ai ∈D, i=2,...,n }基本操作:} ADT String
  

StrInsert (&S, pos, T)    (插入) 
初始条件:串 S 和 T 均存在,1≤pos≤StrLength(S)+1。
操作结果:在串 S 的第 pos 个字符之前插入串T。 
例如:S = "chater",T = "rac", 则执行 StrInsert (S, 4, T)                得到 S = "character" 

StrDelete (&S, pos, len)    (删除) 
初始条件:串 S 存在,且1≤pos≤StrLength(S)-len+1。
操作结果:从串 S 中删除第 pos 个字符起长度为len的子串。 

StrAssign (&T, chars)    (串赋值) 
初始条件:chars 是字符串常量。 
操作结果:把 chars 赋为 T 的值。

StrCopy (&T, S)    (串复制) 
初始条件:串 S 存在。 
操作结果:由串 S 复制得串 T。

Concat (&T, S1, S2)    (串联接) 
初始条件:串 S1 和 S2 存在。 
操作结果:T 为由串 S1 和串 S2 联接所得的串。
例如: Concat( T, "man", "kind")           求得  T = "mankind"         Concat( T, "kind", "man")           求得  T = "kindman"

StrCompare (S, T)    (串比较) 
初始条件:串 S 和 T 都存在。 
操作结果&#xff1a;若串 S > T, 则返回值>0&#xff1b;若S&#61;T, 则返回值&#61;0&#xff1b;若串 S < T, 则返回值<0. 
例如&#xff1a;StrCompare("data", "state") < 0             StrCompare("compute", "case") > 0

Replace ( S, T, V)    (串置换) 
初始条件&#xff1a;串 S, T 和 V 均已存在&#xff0c;且 T 是非空串。 
操作结果&#xff1a;用 V 替换主串 S 中出现的所有与&#xff08;模式串&#xff09;T 相等的不重叠的子串。 
例如&#xff1a;假设 S &#61; "abcaabcaaabca",  T &#61; "bca"若 V &#61; "x", 则经置换后得到     S &#61; "axaxaax"若 V &#61; "bc", 则经置换后得到      S &#61; "abcabcaabc"

SubString (&Sub, S, pos, len)    (求子串) 
初始条件&#xff1a;串 S 存在&#xff0c;1≤pos≤StrLength(S)    且  0≤len≤StrLength(S)-pos&#43;1。     
操作结果: 以 Sub 返回串 S 中第 pos 个字符起长度为 len 的子串。 
例如&#xff1a;SubString ( sub, "commander", 4, 3)   求得  sub &#61; "man"
SubString( sub, "commander", 1, 9)  求得  sub &#61; "commander" 
SubString( sub, "commander", 9, 1)  求得  sub &#61; "r"

Index ( S, T, pos)    (定位函数) 
初始条件&#xff1a;串 S 和 T 存在&#xff0c;且 T 是非空串&#xff0c; 1≤pos≤StrLength(S)。 
操作结果&#xff1a;若主串 S 中存在和串 T 值相同的子串&#xff0c;则返回它在主串 S 中第 pos个字符起第一次出现的位置;  否则函数值为0。 
假设 S &#61; "abcaabcaaebc",  T &#61; "abc"        Index(S, T, 1) &#61; 1;    Index(S, T, 3) &#61; 5;   Index(S, T, 8) &#61; 0;

串和线性表的区别
串的逻辑结构和线性表极为相似&#xff0c;区别仅在于串的数据对象约束为字符集。
串的基本操作和线性表有很大差别。
        在线性表的基本操作中&#xff0c;大多以“单个元素”作为操作对象&#xff1b;     
        而在串的基本操作中&#xff0c;通常以“串的整体”作为操作对象。 

串的表示和实现

定长顺序存储特点&#xff1a;  
用一组连续的存储单元来存放串&#xff0c;直接使用定长的字符数组来定义&#xff0c;数组的上界预先给出&#xff0c;故称为静态存储分配。 
例如&#xff1a; 
#define Maxstrlen 255    //用户可用的最大串长    
typedef unsigned char SString[ Maxstrlen&#xff0b;1 ] ;       
SString s;   //s是一个可容纳255个字符的顺序串。
注&#xff1a;  一般用SString[0]来存放串长信息&#xff1b; 
C语言约定在串尾加结束符 ‘ \0’&#xff0c;以利操作加速&#xff0c;但不计入串长&#xff1b; 
若字符串超过Maxstrlen 则自动截断&#xff08;因为静态数组存不 进去&#xff09;。 

如果想要存放超长的字符串&#xff0c;静态数组有缺陷&#xff0c;改用动态分配的一维数组----------堆

堆分配存储特点&#xff1a;
仍用一组连续的存储单元来存放串&#xff0c;但存储空间是在程序执行过程中动态分配而得。
思路&#xff1a;利用malloc函数合理预设串长空间。 
特点&#xff1a; 若在操作中串值改变&#xff0c;还可以利用realloc函数按新串长度增加(堆砌)空间。 
约定&#xff1a;所有按堆存储的串&#xff0c;其关键信息放置在&#xff1a;

Typedef struct {     
char *ch;     // 若非空串,按串长分配空间; 否则 ch &#61; NULL     
int length;   //串长度 
}HString 
用“堆”实现串插入操作


Status StrInsert ( HString &S, int pos, HString T ) { //在串S的第pos个字符之前&#xff08;包括尾部&#xff09;插入串T if (pos<1||pos>S.length&#43;1) return ERROR; //pos不合法则告警 if(T.length){ //只要串T不空&#xff0c;就需要重新分配S空间&#xff0c;以便插入T if (!&#xff08;S.ch&#61;(char*)realloc (S.ch, (S.length&#43;T.length)* sizeof(char)) )) exit(OVERFLOW); for ( i&#61;S.length-1; i>&#61;pos-1; --i ) //为插入T而腾出pos之后的位置 S.ch [i&#43;T.length] &#61; S.ch [i]; //从S的pos位置起全部字符均后移 S.ch[pos-1…pos&#43;T.length-2] &#61; T.ch[0…T.length-1]; //插入T&#xff0c;略/0 S.length &#43; &#61; T.length; //刷新S串长度 } return OK;
}//StrInsert

堆分配存储表示

比较字符串是否相同

Int Strcompare ( Hstring S, Hstring T ) { for ( i &#61; 0; i } // StrCompare
清空字符串

Status ClearString ( Hstring &S) { if ( S.ch ) { free(S.ch); S.ch &#61; NULL; } S.length &#61; 0; return OK;
} // ClearString

联接两个串成新串

Status Concat ( HString &T, Hstring S1, Hstring S2 ) { //用T返回由S1和S2联接而成的新串。 if (T.ch) free(T.ch); // 释放旧空间 if ( !(T.ch &#61; (char *) malloc ((S1.length&#43;S2.length) *sizeof (char) ) ) ) exit ( OVERFLOW); T.ch[0 .. S1.length-1] &#61; S1.ch[0 .. S1.length-1]; T.length &#61; S1.length &#43; S2.length ; T.ch [S1.length .. T.length-1] &#61; S2.ch [0 .. S2.length-1]; return OK;
} // Concat

求子串

Status SubString ( Hstring &Sub, Hstring S, int pos, int len ) { //用Sub返回串S的第pos个字符起长度为len的子串。 // 其中,1<&#61;pos<&#61; StrLength (S) 且 0<&#61;len<&#61;StrLength(S)-pos&#43;1。 if ( pos <1 || pos>S.length || len<0 || len>S.length-pos&#43;1) return ERROR; // 参数不合法 if ( Sub.ch) free ( Sub.ch); // 释放旧空间 if (!len) { Sub.ch &#61; NULL; Sub.length &#61; 0; } // 空子串 else {// 完整子串 Sub.ch &#61; ( char *) malloc ( len *sizeof ( char )); Sub.ch[0..len-1] &#61; S.ch [ pos-1.. Pos&#43;len-2] ; Sub.length &#61; len; } return OK;}

块链类型定义&#xff1a;

#define CHUNKSIZE 80 //可由用户定义的块大小 typedef struct Chunk { //首先定义结点类型 char ch [ CHUNKSIZE ]; //结点中的数据域 struct Chunk * next ; //结点中的指针域 }Chunk;typedef struct { //其次定义用链式存储的串类型 Chunk *head; //头指针 Chunk *tail; //尾指针 int curLen; //结点个数 } LString; //串类型只用一次&#xff0c;前面可以不加Lstring

注&#xff1a;
串与线性表的运算有所不同&#xff0c;是以“串的整体”作为操作对象&#xff0c;例如查找某子串&#xff0c;在主串某位置上插入一个子串等。 
这类操作中均涉及到定位问题&#xff0c;称为串的模式匹配。它是串处理系统中最重要的操作之一。     




关于串的模式匹配敬请期待。
申明&#xff1a;备考期末&#xff0c;如果不到之处&#xff0c;敬请指出&#xff0c;感激不尽。






推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
author-avatar
xzh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有