网站不足之处,宁波建站方案,网站关键词排名优化价格,中国空间站图片绘画一、引入 在计算机中的处理的数据内容大致可分为以整形、浮点型等的数值处理和字符、字符串等的非数值处理。 今天我们主要学习的就是字符串数据。本章主要围绕“串的定义、串的类型、串的结构及其运算”来进行串介绍与学习。
二、串的定义 2.1、串的基本定义 串#xff08;s…一、引入 在计算机中的处理的数据内容大致可分为以整形、浮点型等的数值处理和字符、字符串等的非数值处理。 今天我们主要学习的就是字符串数据。本章主要围绕“串的定义、串的类型、串的结构及其运算”来进行串介绍与学习。
二、串的定义 2.1、串的基本定义 串string是由零个或多个字符组成的有限序列也是一种内容受限的线性表。其特殊性体现在数据元素是一个字符。一般表示为
Sabcdefg; 其中S是串的名双引号内元素的个数为串的长度0个元素的串被称为空串其长度为0
Tips字符串中的“空格”也算是串的一个元素当一个串的元素只有空格时这个串称为“空格串”
2.2、子串以及串相等的条件 在一个串中任意几个连续字符所组成的序列称之为该串的子串包含子串的串叫做主串。子串在主串中的位置通常用子串的第一个字符在主串中的位置表示。 例如下图的四个串 它们的长度分别为3、4、7、8.且a、吧、都是c和d的子串。其中a在c、d中的位置都是1.而b在c中的位置为4在d中的位置为5。 那么怎么判断两个串是否相等呢一般来说只有当两个串的长度相等且各个位置对应的字符都相等时才相等。像上图中的a、b、c、d彼此都不相等。
三、串的类型定义和储存结构 3.1、串的类型定义与基本操作 串的逻辑结构与先信标相似但其基本操作的对象却有较大的区别。串的操作主要集中在“子串”这样的一个部分整体而不是单个元素。
其常见的基本操作如下
函数初始条件操作结果StrAssign(T,chars)chars是字符串常量生成一个其值等于chars的串TStrCopy(T,S)串S存在由串S复制得到串TStrEmpty(S)串S存在判断串S是否为空串StrCompare(S,T)串S、T存在比较S、T的大小。分别返回0、1、0的值StrLength串S存在返回串S的长度元素个数ClearString串S存在将S清为空串Concat(T,s1,s2)串s1、s2存在将s1、s2拼接并由T返回SubString(Sub,S,pos,len)串S存在1posStrLength(S)且0lenStrLength(S)-pos1用sub返回串S的第pos个字符起长度为len的子串Index(S,T,pos)串S、T存在T非空串1posStrLength(S).若S、T中有相同的子串则返回它在主串S中的第pos个字符后第一次出现的位置否则返回0Replace(s,T,V)串S、T存在T非空串用V替换主串S中出现的所有与T相等的不重叠子串StrInsert(S,pos,T)串S、T存在1posStrLength(S)1.在串S的第pos个字符前插入串TStrDelete(S,pos,len)串S存在1posStrLength(S)-len1从S中删除第pos个字符起长度为len的子串DestoryString(S)串S存在销毁串S
3.2、串的储存结构 同其他数据结构一样串也是有着最为常见的两种储存结构——顺序和链式。但考虑到存储效率和算法方便性串多采用链式存储。
3.2.1、顺序存储 1、定长顺序存储 类似于线性表用一组地址连续的存储单元存储串值的字符序列按照预定义的大小为每个串变量分配一个固定长度的存储区。则可用定长数组如下表示
#define MAXLEN 255 //定义串的最大长度
typedef struct{char ch[MAXLEN1]; //存储串的一维数组int length; //记录串的长度
} SSting; 但这种存储方式如同它的名字一样是存储长度是固定的。串的实际长度只能小于等于MAXLEN超过预定义长度的串值会被舍去称为截断。串长有两种表示方法: 一是如上述定义描述的那样用一个额外的变量len来存放串的长度;二是在串值后面加一一个不计入串长的结束标记字符“\0”此时的串长为隐含值。 但是现实生活中所遇到的数据长度都是不固定的。这时候内存的动态分布就显得格外重要。这时候就印出了一个新的顺序存储结构——堆分配存储。
2、堆分配存储 在c语言中存在一个称之为堆Heap的自由存储区可以为每个新产生的串动态分配一块实际串长所需要的存储空间若分配成功则返回指向起始地址的指针作为串的基址同时为了方便处理约定串长也作为存储结构的一部分。定义如下
typedef struct{char *ch; //若是非空串则按串长分配存储区否则ch为NULLint length;
}HString; 3.2.2、链式存储 在顺序串中我们发现如果对其进行插入或者删除操作就显得十分麻烦。而链表结构在这方面就刚好能弥补这个弊端。但由于串的特殊性——结构中的每一个数据元素是一个字符所以存在一个问题——每个结点中可以只存放一个字符也可以存放多个字符。如图所示 所以当结点大小大于1时由于串长不一定是结点大小的整数倍所以链表中最后一个结点不一定全被串值占满。此时通常补上“#”或其他非串值字符。 为了操作方便当以链表存储串值的时候除头指针外还可附设一个尾指针指示链表中的最后一个结点并给出当前串的长度。说明如下
#define CHUNKSIZE 80 //定义块大小//定义结点结构
typedef struct Chunk{char ch[CHUNKSIZE];struct Chunk *next;
}Chunk;typedef struct{Chunk *head,*tail; //串的头尾指针int length; //串的长度
}LString 串值的链式存储结构对某些串操作有一定的方便之处但总体来说不如顺序结构灵活。它占用存储量大且操作复杂。
四、小结 本文主要介绍了串的定义及其存储结构。涉及到的串的匹配算法相对比较重要所以将单独发布来学习。 如果我的内容对你有帮助在下就厚着脸皮讨个点赞关注。如果你有更好的想法还望留在评论区让我来参考学习。我将不胜感激并努力创作出更好的内容。