数据结构第四章(串)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
char *ch; // 若是非空串,则按串长分配存储区,否则ch为NULL int length; // 串长度 } HString;
基于堆分配存储结构的基本运算:
1.串插入操作:
Status StrInsert(HString &S, int pos, HString T){ //1≤pos≤StrLength(S)+1。在串S的第pos个字符之前插入串T
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) {
SubString(sub, commander, 4, 7) sub = ? SubString(sub, beijing, 7, 2) = ? sub = ? 起始位置和子串长度之间存在约束关系 SubString(student, 5, 0) = 长度为 0 的子串为“合法”串
二、串的抽象数据类型的定义:
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是字符串常量。
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; }
return ERROR;
Sub[1…len]=S[pos…pos+len-1]; Sub[0]=len; return OK; }//SubString
小结:串的顺序存储结构特点:wk.baidu.com实现串操作的原操作为“字符序列的复制 ”,操作的时间复 杂度基于复制的字符序列的长度;
如果在操作中出现串值序列的长度超过上界MAXSTRLEN时, 约定用截尾法处理。
}
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)
...
a[n]
Pascal
C
1. 串联接的实现Concat(&T,S1,S2)
假设S1、S2和T都是SString型的串变量,且串T是由串S1联结 串S2得到的,即串T的值的前一段和串S1的值相等,串T的值的后 一段和串S2的值相等,则只要进行相应的“串值复制”操作即可, 对超长部分实施“截断”操作。以下是串联接可能出现的三种情 况: (1)S1 4 a S1,S2串长和小于最大值 b c d
操作结果:用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。
二、串的堆分配存储表示(动态存储)
静态存储的顺序串是在程序执行前已确立了串值空间的大 小,而在实际操作中串值长度的变化是比较大的,因此可使用 动态存储方式。
在C语言中所有串变量可共享一个容量很大、地址连续的称 之为“堆”的自由存储空间,因此顺序串的动态存储表示又称 为“堆分配存储表示”。C语言中的串以’\0‟为结束符,串长 是一个隐含值。为处理方便,约定串长也作为存储结构的一部分。 typedef struct {
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);
第四章
串
4.1 串类型的定义
4.2 串的表示和实现
4.3 串的模式匹配算法
本章内容导读:
随着计算机技术的发展,计算机被越来越多地 用于解决非数值处理问题,这些问题中所涉及的主 要操作对象是字符串,或简称串。若在汇编程序或 编译程序中,源程序和目标程序都是字符串数据; 在管理信息系统中,用户的姓名、地址、商品的名 称、规格等也是作为字符串处理的。串是一种特殊 的线性表,本章主要讨论串的基本概念、存储结构 和几种最基本的串操作算法。
Concat (&T, S1, S2)
初始条件:串S1和S2存在。 操作结果:用T返回由S1和S2联接而成的新串。
例:Concat( T, man, kind)
求得 T = mankind
SubString (&Sub, S, pos, len) 初始条件:串S存在,1≤pos≤StrLength(S)且 0≤len≤StrLength(S)-pos+1。 操作结果:用Sub返回串S的第pos个字符起长度为len的子串。 例如: SubString( sub, commander, 4, 3) 求得 sub = man ; SubString( sub, commander, 1, 9) 求得 sub = commander; SubString( sub, commander, 9, 1) 求得 sub = r;
零个字符的串称为空串,它的长度为零。记为:s=„‟
3、空格串: 由一个或多个空格组成的串‘ ’;(此处不是空串,长度是空 格字符的个数。
4、子串、主串: 串中任意个连续的字符组成的子序列称为该串的子串。包 含子串的串相应地称为主串。空串是任意串的子串。通常称字 符在序列中的序号称为该字符在串中的位置。子串在主串中的 位置则以子串的第一个字符在主串中的位置来表示。 例1:a='BEI', b='JING', c='BEIJING', d='BEI JING' 串长分别为3,4,7,8,且a,b都是c,d的子串,但b在c、d中的位置 不同。 例2:有两个串s1和s2: s1=‟I_am_a_student‟ s2=‟am‟, 则s2是s1的子串,s1为主串。s1的长度为14,s2的长度为2。s2 在s1中的位置是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;
// 用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]]; // 未截断
Index (S, T, pos) 初始条件:串S和T存在,T是非空串,1≤pos≤StrLength(S)。 操作结果:若主串S中存在和串T值相同的子串,则返回它在主串 S中第pos个字符之后第一次出现的位置; 否则函数值为0。 Replace (&S, T, V) 初始条件:串S,T和V存在,T是非空串。
#define MAXSTRLEN 255 // 用户可在255以内定义最大串长 // 0号单元存放串的 typedef unsigned char SString[MAXSTRLEN + 1]; 长度
串的实际长度可在这个预定义长度的范围内随意设定,超 过预定义长度的串值则被舍去,称之为“截断”。
如何识别串的长度呢?
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]
4.1 串类型的定义
一、串的基本概念 1、串的定义:
串(或字符串),是由零个或多个字符组成的有限序列。一般 记为:s='a1a2...an'(n>=0)
其中s是串的名,用单引号括起来的字符序列是串的值;单引 号本身不属于串;ai(1<=i<=n)是组成串的字符,可以是字母、数 字或其他字符;串中字符的数目n称为串的长度。 2、空串:
5、两个串相等的充分必要条件:
当且仅当这两个串的值相等。即只有当两个串的长度相等,并 且各个对应位置的字符都相等时才相等。
串的逻辑结构和线性表极为相似,区别仅在于串的数据对象 约束为字符集。然而,串的基本操作和线性表有很大差别。在线 性表的基本操作中,大多以“单个元素”作为操作对象;而在串 的基本操作中,通常以“串的整体”作为操作对象,如:在串中 查找某个子串、求取一个子串、在串的某个位置上插入一个子串 以及删除一个子串等。 注意: Ø串是一种特殊的线性表,其特殊性在于数据元素是一个字 符; Ø不要把空格串和空格相混淆; Ø值为单个字符的字符串不等同于单个字符,如字符串’a‟ 不 等于字符a。
操作结果:把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清为空串。
StrDelete (&S, pos, len)
初始条件:串S存在,1≤pos≤StrLength(S)-len+1。 操作结果:从串S中删除第pos个字符起长度为len的子串。 DestroyString (&S) 初始条件:串S存在。
操作结果:串S被销毁。
} ADT String
4.2 串的表示和实现 在多数非数值处理的程序中,串也以变量的形式出现。 串的存储结构:顺序存储结构和链式存储结构,顺序存储结构 又包括定长顺序存储结构(静态存储)和堆分配存储结构(动 态存储)。 一、串的定长顺序存储表示 (静态存储) 类似于线性表的顺序存储结构,用一组地址连续的存储单 元存储串值的字符序列。 按照预定义的大小,为每个定义的串 变量分配一个固定长度的存储区,则可用定长数组来描述: