串数据结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*指示串的当前长度*/
}SeqString;
/*SeqString是顺序串类型*/
在这种方式中,字符串的串值由ch[0]开始存放。当 然,也可以将串的实际长度存储在0号单元中,实际 串值从1号单元处开始存放。实际应用中究竟采用哪 种结构,需要根据情况进行权衡。在C语言中是采用 字符'\0'作为串的终结符的方式。
char string1[]="string"; /*string1是一个串变量名, 字符序列string是赋给它的值*/
串的基本操作
▪求串长Strlen(s) :求串s的长度,Strlen(s)的值是 一个非负整数。若s是一个空串,则Strlen(s)=0。 ▪串赋值StringAssign(s,string_constant) :给串 s赋值。其中string_constant可为串变量、串常量 或经过适当运算所得到的串值。 ▪串复制Strcpy(s,t):由串s复制得到串t。 ▪串联接Strcat(s,t):将串t联接到串s的末尾形成新 串s。 ▪串比较Strcmp(s,t):比较s和t的大小,若s<t,则 返回值小于0;若s>t,则返回值大于0;若s=t,则 返回值为0 。
Biblioteka Baidu
▪ 串的比较 当且仅当两个串的长度相等,并且 各个对应位置的字符也都相同,称两个串相等; 当两个串不相等时,可按“字典顺序”区分大 小(在C语言中,按字符ASCII码的大小为准)。
例如,有下列四个串s1,s2,s3,s4: s1= "pro" , s2= "Program"
s3= "program" , s4= "program□" 以上四个串彼此互不相等,且s4>s3>s1>s2。
▪ 第二种不使用终结符,用一个整数length来指示串的 实际长度,length-1表示串中最后一个字符的存储位 置。
类型定义如下:
#define MaxStrSize 256 /*串可能的最大长度*/
typedef struct
{ char ch[MaxStrSize];
int length;
▪ 串删除StrDelete(s,pos,len):从串s中位置pos开始, 删除len个字符。
▪ 子串替换操作Replace(s,t,v):将串s中的子串t全部 替换成串v。
4.2 串的表示和实现
串的定长顺序存储
串的顺序存储结构,简称为顺序串。用一组 地址连续的存储单元来依次存放串中的字符 序列,串中相邻的字符顺序存放在相邻的的 存储单元中。所谓定长,指按照预先定义的 大小为每一个串分配一个固定的存储区域。 通常有两种实现方式:
在C语言中,由动态分配函数malloc( )分配一块 实际串长所需的存储空间,若分配成功,则返回一 个指向起始地址的指针,作为串的基址。由函数 free( )释放串不再需要的空间。
▪ 串变量与串常量 串变量和其它类型的变量一 样,其取值是可以改变的,它必须用名字来识 别;串常量和整常数、实常数一样,具有固定 的值,在程序中只能被引用但不能改变其值, 即只能读不能写。
例如,在C语言中,有下列语句:
char x[]="456"; /*x是一个串变量名,它的值为字符 序列456,而不是整数456*/
▪ 求子串Substr(s,pos,len,sub):从串s中的第pos个 字符开始取长度为len的子串构成串sub。
▪ 子串的定位Index(s,t):在串s中寻找串t第一次出现 时,串t首字符在串s中的位置。若找到,则返回该位 置,否则返回0。
▪ 串插入StrInsert(s,pos,t):将串t插入在串s的位置 pos上。
▪ 串复制Strcpy(s,t):将串s复制到串t中。
SeqString *Strcpy(SeqString s,SeqString *t)
{
int i;
for(i=0;i<s.length;i++)
t→ch[i]=s.[i];
t→length=s.length;
/*置串t的长度*/
return(t);
}
串的顺序存储表示下,串操作的实现主要是 进行“字符序列的复制”,操作的时间复杂度 基于复制的字符序列的长度。在这种存储方式 下,涉及串长的操作速度快,但也存在不足之 处:一是需事先预定义串的最大长度,这在程 序运行前是很难估计的;二是由于定义了串的 最大长度,串值空间的大小在编译时刻就已确 定,是静态的,使得串的某些操作受限,如串 的联接、插入等操作受到串值空间大小的制约 。这种串的定长顺序表示不够灵活,适应范围 有一定局限。
▪ 空串与空格串 长度为零(n=0)的串称为空 串(Null String),它不包含任何字符。由 空格字符组成的串,称为空格串(Blank String)。它的长度为串中空格字符的个数。
▪ 子串与主串 串中任意个连续字符组成的子序 列称为该串的子串。包含子串的串称为该子串 的主串。
▪ 子串的位置 将子串在主串中首次出现时,该 子串首字符对应的主串序列中的序号定义为子 串在主串中的位置。
第四章 串
▪ 基本概念 ▪ 串的存储结构 ▪ 串的基本操作 ▪ 串的模式匹配
4.1 图的定义和基本操作
串定义 是字符串的简称,是零个或多个字符
组成的有限序列。一般记为: S="a1a2……an" (n≥0)
其中 S是串名; 用双引号(“”)括起的字符序列是串的
值; ai(1≤I≤n)可以是字母、数字或其它符; 串字符的数目n称为该串的长度;
顺序串的基本操作的实现
下面讨论串的部分基本操作的实现算法。 串的数据类型说明如下: #define MaxStrSize 256 typedef struct{ char ch[MaxStrSize]; int length; }SeqString;
▪ 求串长Strlen(s) :返回串s的元素个数。 int Strlen(SeqString s) { return(s.length);}
串的堆存储结构
堆存储结构的特点是:仍以一组空间足够大的、地 址连续的存储单元存放串值字符序列,但该存储空 间的大小不是预定义,而是在程序执行过程中动态 分配的。每当产生一个新串时,系统就从剩余空间 的起始处为串值分配一个长度和串值长度相等的存 储空间。这种方式可以灵活地申请适当数目的存储 空间,从而提高存储资源的利用率。