- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return ERROR;
Sub[1…len]=S[pos…pos+len-1]; Sub[0]=len; return OK; }//SubString
小结:串的顺序存储结构特点: 实现串操作的原操作为“字符序列的复制 ”,操作的时间复 杂度基于复制的字符序列的长度;
如果在操作中出现串值序列的长度超过上界MAXSTRLEN时, 约定用截尾法处理。
1. 类似顺序表,定义一个表示串长度的域;
typedef struct { char ch[MAXSTRLEN];
int len;
}SqString;
2.串长可用下标为0的数组元素存储; 3.也可在串值后设特殊标记,‘\0‟:
a[0]
3 a
a[1]
a b
a[2]
b c
a[3]
c \0
a[4]
a[5]
}
else { // S1[0] = MAXSTRSIZE截断(仅取S1) T[0..MAXSTRLEN] = S1[0..MAXSTRLEN]; uncut = FALSE; }
return uncut;
} // Concat
2.求子串SubString(&Sub,S,pos,len)
Status SubString(Sstring &sub,Sstring S, int pos , int len){ //其中,1=<pos<=StrLength(s)且 0=<len<=StrLength(s)-pos+1。 //用sub返回S串中从第pos个位置开始,长度为len的字符串 if (pos<1|| pos>s[0] || len<0 || < len>S[0]-pos+1)
二、串的堆分配存储表示(动态存储)
静态存储的顺序串是在程序执行前已确立了串值空间的大 小,而在实际操作中串值长度的变化是比较大的,因此可使用 动态存储方式。
在C语言中所有串变量可共享一个容量很大、地址连续的称 之为“堆”的自由存储空间,因此顺序串的动态存储表示又称 为“堆分配存储表示”。C语言中的串以’\0‟为结束符,串长 是一个隐含值。为处理方便,约定串长也作为存储结构的一部分。 typedef struct {
4.1 串类型的定义
一、串的基本概念 1、串的定义:
串(或字符串),是由零个或多个字符组成的有限序列。一般 记为:s='a1a2...an'(n>=0)
其中s是串的名,用单引号括起来的字符序列是串的值;单引 号本身不属于串;ai(1<=i<=n)是组成串的字符,可以是字母、数 字或其他字符;串中字符的数目n称为串的长度。 2、空串:
for (i=S.length-1; i>=pos-1; --i)
//第 pos 个字符开始长度为S.length-pos+1的子串移到串的最后
S.ch[i+T.length]=S.ch[i];
S.ch[pos-1..pos+T.lenght-2]=T.ch[0..T.length-1];//插入T S.length+=T.length; }
操作结果:用V替换主串S中出现的所有与T相等的不重叠的子串。
假设 S = abcaabcaaabc, T = bca
Index(S, T, 1) = 2; Index(S, T, 3) = 6; Index(S, T, 8) = 0;
StrInsert (&S, pos, T) 初始条件:串S和T存在,1≤pos≤StrLength(S)+1。 操作结果:在串S的第pos个字符之前插入串T。
操作结果:把chars赋为T的值。
StrCopy(&T, S): StrEmpty (S): 初始条件:串S存在。
操作结果:由串S复制得串T。 初始条件:串S存在。
操作结果:若S为空串,则返回TRUE,否则返回FALSE。
StrCompare(S, T) 初始条件:串S和T存在。 操作结果:若S T,则返回值 0;若S T,则返回值 0;若S T,则返回值 0。例:StrCompare(data, state) < 0 StrCompare(cat, case) > 0 StrLength(S) 初始条件:串S存在。 操作结果:返回S的元素个数,称为串的长度。 ClearString (&S) 初始条件:串S存在。 操作结果:将S清为空串。
#define MAXSTRLEN 255 // 用户可在255以内定义最大串长 // 0号单元存放串的 typedef unsigned char SString[MAXSTRLEN + 1]; 长度
串的实际长度可在这个预定义长度的范围内随意设定,超 过预定义长度的串值则被舍去,称之为“截断”。
如何识别串的长度呢?
Index (S, T, pos) 初始条件:串S和T存在,T是非空串,1≤pos≤StrLength(S)。 操作结果:若主串S中存在和串T值相同的子串,则返回它在主串 S中第pos个字符之后第一次出现的位置; 否则函数值为0。 Replace (&S, T, V) 初始条件:串S,T和V存在,T是非空串。
StrDelete (&S, pos, len)
初始条件:串S存在,1≤pos≤StrLength(S)-len+1。 操作结果:从串S中删除第pos个字符起长度为len的子串。 DestroyString (&S) 初始条件:串S存在。
操作结果:串S被销毁。
} ADT String
4.2 串的表示和实现 在多数非数值处理的程序中,串也以变量的形式出现。 串的存储结构:顺序存储结构和链式存储结构,顺序存储结构 又包括定长顺序存储结构(静态存储)和堆分配存储结构(动 态存储)。 一、串的定长顺序存储表示 (静态存储) 类似于线性表的顺序存储结构,用一组地址连续的存储单 元存储串值的字符序列。 按照预定义的大小,为每个定义的串 变量分配一个固定长度的存储区,则可用定长数组来描述:
if (pos<1 || pos>S.length+1) return ERROR;
if (T.length){ //T非空,则重新分配空间,插入T
if (!(S.ch=(char *) realloc(S.ch, (S.length +T.length) *sizeof(char))))
exit(OVERFLOW);
S2 2 T 6
e a a g a
f b b h b c c i c d d j d e e k e f f l f g h
(2) S1,S2串长和超过最大串长
S1 6 S2 6 T 8
(3) S1串长等于最大串长
S1 8
S2 2
a
i
bБайду номын сангаас
j
c c
d d
e e
f f
g g
h h
T
8
a
b
算法描述如下: Status Concat(SString S1, SString S2, SString &T) {
二、串的抽象数据类型的定义:
ADT String {
数据对象:D={ai|ai∈CharacterSet, i=1,2,...,n, n≥0 } 数据关系:R1={<ai-1,ai>|ai-1, ai ∈D, i=2,...,n } 基本操作: StrAssign(&T, chars):初始条件:chars是字符串常量。
// 用T返回由S1和S2联接而成的新串。若未截断,
// 则返回TRUE,否则FALSE。 if (S1[0]+S2[0] <= MAXSTRLEN) { T[1..S1[0]] = S1[1..S1[0]]; T[S1[0]+1..S1[0]+S2[0]] = S2[1..S2[0]]; // 未截断
SubString(sub, commander, 4, 7) sub = ? SubString(sub, beijing, 7, 2) = ? sub = ? 起始位置和子串长度之间存在约束关系 SubString(student, 5, 0) = 长度为 0 的子串为“合法”串
第四章
串
4.1 串类型的定义
4.2 串的表示和实现
4.3 串的模式匹配算法
本章内容导读:
随着计算机技术的发展,计算机被越来越多地 用于解决非数值处理问题,这些问题中所涉及的主 要操作对象是字符串,或简称串。若在汇编程序或 编译程序中,源程序和目标程序都是字符串数据; 在管理信息系统中,用户的姓名、地址、商品的名 称、规格等也是作为字符串处理的。串是一种特殊 的线性表,本章主要讨论串的基本概念、存储结构 和几种最基本的串操作算法。
T[0] = S1[0]+S2[0]; uncut = TRUE; }
else if (S1[0] < MAXSTRSIZE) { T[1..S1[0]] = S1[1..S1[0]];
// 截断
T[S1[0]+1..MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]]; T[0] = MAXSTRLEN; uncut = FALSE;
char *ch; // 若是非空串,则按串长分配存储区,否则ch为NULL int length; // 串长度 } HString;
基于堆分配存储结构的基本运算:
1.串插入操作:
Status StrInsert(HString &S, int pos, HString T){ //1≤pos≤StrLength(S)+1。在串S的第pos个字符之前插入串T