第四章 数据结构
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} // Index
12
练习: 已知:s=''(XYZ)+*'',t=''(X+Z)*Y''。试利用联接、 求子串和置换等基本运算,将 s 转化为 t。
13
串的存储结构
❖ 串的定长顺序存储表示 ❖ 串的堆分配存储表示
串的顺序存储表示
ຫໍສະໝຸດ Baidu
❖ 串的块链存储表示
串的链式存储表示
16
串的定长顺序存储表示
❖ 定长:按照预定义的大小为串分配一个固定的存储区域。 ❖ C语言中,可以用字符数组实现串的定长顺序存储。
j = 1; while ( j<=S2.length) T.ch[k++] = S2.ch[j++]; // 复制串 S2
T.ch[k] = ‘\0’;
// 置结果串T的结束标志
T.lenght=S1.length+S2.length;
} // Concat
19
2、求子串操作
bool SubString (SString &Sub, SString S, int pos, int len ) {
SubString (Sub, ''commander'' , 4, 3) Sub= ''man''
Index (S, T, pos) 初始条件:串S和T存在,T 是非空串,1≤pos≤StrLength(S)。 操作结果:若主串S中存在和串T值相同的子串,则返回它在主串S中 第pos个字符之后第一次出现的位置;否则函数值为0。 Index(''This is a pen'', ''is'', 1) Index(''This is a pen'', ''is'', 4) Index(''This is a pen'', ''is'', 6)
i = pos;
while ( i <= n-m+1) {
SubString (sub, S, i, m);
// 取得从第 i 个字符起长度为 m 的子串
if (StrCompare(sub,T) != 0) ++i ;
else return i ;
// 找到和 T 相等的子串
} // while
} // if return 0; // S 中不存在满足条件的子串
T.length=S.length;
} // StrCopy
21
4、串删除操作
bool StrDelete (SString &S, int pos, int len) {
// 若1≤pos≤S.length-len+1,则删除S中第pos个
//字符起长度为len的子串,并返回true,否则返回false
return false; for ( j = 1; j <= len; j++ )
Sub.ch[ j ] = S.ch[ pos + j-1 ]; // 向子串Sub复制字符 Sub.ch[j] = ‘\0’; // 置串Sub的结束标志 Sub.length=len; return true; } // SubString
10
❖ 抽象数据类型String定义的13种操作中,串赋值StrAssign、 串比较StrCompare、求串长StrLength、串联接Concat及求 子串SubString 5种操作构成串类型的最小操作子集。
❖ Index(S,T,pos)算法的基本思想: (1) 从主串S的第 i个字符起、取长度和串T相等的子串 (2) 用取得的子串和串T比较 (3) 若相等, i即为所求值,否则 i 值增1直至找到和T相等 的子串或者S中不存在和T相等的子串为止。 也就是求使等式 StrCompare( SubString(S,i,StrLength(T)),T)==0 成立的i值 pos≤i≤ n-m+1 (n,m分别为串S,T的长度)
20
3、串复制操作
void StrCopy (SString &T, SString S)
{ // 将串S复制到串T中 for ( j = 1; j <= S.length; j++ )
T.ch[ j ] = S.ch[ j ]; T.ch[j] = ‘\0’;
// 向串T中复制字符 // 置串T的结束标志
if (pos < 1 || pos > S.length-len+1) return false;
for ( j = pos+len; j < S.length; j++ )
S.ch [j-len ] = S.ch[ j ];
// 删除位置后面的子串前移
S.length-=len;
12
return true;
if (T.length) { // T 非空,则为S重新分配空间并插入 T
// 若1≤pos≤S.length+1,则在串S的第pos个 // 字符之前插入串T,并返回true,否则串S不变,并返回false
if (pos < 1 || pos > S.length+1) return false; char S1[S.length] ; // S1 作为辅助串空间用于暂存 S.ch
01
s1 s2
pos-1
S.length-1
01
…
spos Spos+1
…
Slength
T1 T2
T.length-1
…
Tlength
01
s1 s2
pos-1
…
T1 …
Tlength
Spos
Spos+1
…
Slength
23
bool StrInsert (HString& S, int pos, HString T) {
事务处理程序中的信息等都作为串处理。
❖ 串是由0个或多个字符组成的有限序列。通常记作 s = ''a1a2 … an'' (n≥0)
其中,
s:串名 ''a1a2 … an'':串值 n:串的长度 i:字符ai在串中的位序
4
注意:
1. 串值必须用一对双引号括起来。
s1 = ''aString'';
C语言中:s1=‘a’; s2= ''a'';
数据关系:R1={ 基本操作:
<
ai-1
,
ai
>
|
ai-1
,
ai∈D, i=2,...,n }
StrAssign (&T, chars) 初始条件:chars 是串常量。 操作结果:赋于串T的值为 chars。
StrCopy (&T, S) 初始条件:串 S 存在。 操作结果:由串 S 复制得串 T。
2. 含零个字符的串称为空串,长度为0。
3. 空格也是串的字符集合中的一个元素,可以出现在其他字 符之间。
4. 由一个或多个空格组成的串称为空格串。
'''' , ''ΦΦΦ''和 ''ΦΦΦΦΦ''
符号Φ表示空格符。
空串和空格串不同
5
串的抽象数据类型定义:
ADT String {
数据对象:D={ai| ai ∈CharacterSet, i=1,2,...,n, n≥0 }
DestroyString (&S) 初始条件:串 S 存在。 操作结果:串 S 被销毁。
StrEmpty (S) 初始条件:串 S 存在。 操作结果:若 S 为空串,返回 true,否则 false
6
StrCompare (S, T) //若S=T,返回值=0;若S<T,返回值<0; 若S>T,返回值>0; 串值大小按照”词典次序”进行比较 StrCompare(''data'', ''stru'') StrCompare(''cat'' , ''case'')
11
int Index (String S, String T, int pos) {
// T为非空串,若主串S中存在第 pos 个字符起与T相等的子串, // 则返回第一个这样的子串在S中的位置,否则返回0
if (pos > 0) { n = StrLength(S); m = StrLength(T); // 求串长
}
s1 s2
pos
pos+len
…
spos …
Spos+len
…
len
22
5、插入操作 bool StrInsert (HString &S, int pos, HString T)
基本思想:为串S重新分配存储空间,然后将S串中 插入位置之前的子串、T串以及S串中插入位置之后的子 串依次复制到新分配的存储空间中去。
8
Replace (&S, T, V) 初始条件:串 S,T 和 V 存在,T 是非空串。 操作结果:用V替换主串S中出现的所有与T相等的不重叠的子串。 若S=''abcacabcaca'' T=''abca'' v=''x'' S=''xcxca'' 若v=''ab'' 替换结果为:S=''abcabca''
StrLength (S) //返回串S中的字符个数,即串的长度
ClearString (&S) //将S清空
Concat (&T, S1, S2) //用T返回由S1和S2联接而成的新串 Concat(T, ''man'', ''kind'' ) T =''mankind''
7
SubString (&Sub, S, pos, len) 初始条件:串S存在,1≤pos≤StrLength(S)且 0≤len≤StrLength(S)-pos+1。 操作结果:用 Sub 返回串S的第 pos 个字符起长度为 len的子串。
t = Replac(f,SubString(f,3,6),c), u = Concat(SubString(c,3,1),d), g = 'IS', v = Concat(s,Concat(b,Concat(t,Concat(b,u)))), 试问: s, t, v, StrLength(s), Index(v,g), Index(u,g) 各是什么 ?
#define MAXLEN 255 //串的最大长度 typedef struct{
char ch[MAXLEN+1]; //存放串的字符数组,0号单元不用 int length; //串的当前长度 }SString;
C语言中,’\0’为串的结束符
17
串的堆分配存储表示
❖ 堆分配存储结构的串定义: typedef struct{ char *ch; //ch指向串的起始地址 int length; } HString;
} ADT String 1、串是线性表吗?
2、串和线性表的主要差别是什么?
9
练习: 已知下列字符串
a = ''THIS'', f = ''A SAMPLE'', c = ''GOOD'', d =''NE'', b = '' '', s = Concat(a,Concat(SubString(f,2,7),Concat(b,SubString(a,3,2)))),
❖ 特点:串变量的存储空间在程序执行过程中动态分配。
18
顺序存储结构中串基本操作的实现
❖ 顺序存储结构中实现串操作的基本操作是字符序列复制。
1、串的连接操作
void Concat(SString &T, SString S1, SString S2) { // 以T返回由S1和S2联接而成的新串
j=1; k=1; while ( j<=S1.length) T.ch[k++] = S1.ch[j++]; // 复制串 S1
// 若参数合法(即1≤pos≤S.length 且 // 0≤len≤S.length-pos+1),则以Sub带回串S中第pos个 //字符起长度为len的子串,并返回true,否则返回false if (pos < 1 || pos > S.length || len < 0 || len > S.length-pos+1)
数据结构
第四章 串、数组和广义表
❖ 重点 理解串的类型定义;串的三种存储表示方法及其 基本操作的实现,并能利用这些基本操作实现串 的其它操作。
❖ 难点 理解实现串匹配的KMP算法的思想
2
思考
1、串是线性表吗? 2、串和线性表的主要差别是什么?
3
4.1 串的定义
❖ 串即字符串(String),是计算机非数值处理的主要对象之一 例:编译程序中的源程序和目标程序。
StrInsert (&S, pos, T) 初始条件:串 S 和 T 存在,1≤pos≤StrLength(S)+1。 操作结果:在串 S 的第 pos 个字符之前插入串 T 若S=''chater'',T=''rac'',pos=4 S=''character''
StrDelete (&S, pos, len) 初始条件:串 S 存在,1≤pos≤StrLength(S)-len+1。 操作结果:从串 S 中删除第 pos 个字符起长度为 len 的子串