ch4 串

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

7/30
定位函数 Index(S, T, pos)
int Index(String S, String T, int pos) { if (pos>0){ // pos的合法性 的合法性 n = StrLength(S); m = StrLength(T); i = pos; while( i<=n-m+1) { SubString(sub, S, i, m); if (StrCompare(sub, T) != 0) ++i; else return i; // 返回子串在主串中的位置 } // while } // if return 0; // S中不存在与 相等的子串 中不存在与T相等的子串 中不存在与 } // Index
12/30
4.2 串的表示和实现-定长顺序存储
串联接Concat(&T, S1, S2) 串联接
S1[0]>=MAXSTRLEN T[1..MAXSTRLEN]=S1[1..MAXSTRLEN]; T[0] = MAXSTRLEN; //S2全被截去 全被截去 S1[0]<MAXSTRLEN && S1[0]+S2[0] > MAXSTRLEN T[1..S1[0]]=S1[1..S1[0]]; T[S1[0]+1.. MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]]; T[0]=MAXSTRLEN; //S2部分截断 部分截断 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]]; T[0]=S1[0]+S2[0];
一些操作的实现
基于复制 利用malloc()分配一块足够的空间,再按要求完成复制; 分配一块足够的空间, 利用 分配一块足够的空间 再按要求完成复制; 如StrAssign(&T,chars), Concat(&T, S1, S2), SubString(&Sub, S, pos, len)
15/30
9/30
练习4: s =’I AM A STUDENT’, t =’GOOD’, q=’WORKER’。 设 求:
StrLength(s) = StrLength(t) = SubString(s, 8, 7)= SubString(t, 2, 1)= Index(s, ‘A’)= Index(s, t)=
}//StrInsert
附:堆分配存储表示
Status StrAssign(HString &T, char *chars){ if (T.ch) free(T.ch); for (i=0, c=chars; c; ++i, ++c); else{ if (!(T.ch = (char*)malloc(i*sizeof(char)))) 直到终值为“ 直到终值为“假” T.ch[0..i-1] = chars[0..i-1]; 停止, 停止,串尾特征 是 T.length =i; ‘/0’=NUL=0 = } Return OK; }//StrAssign
16/30
//为插入 而腾出pos之后的位置 为插入T而腾出 之后的位置 为插入 而腾出 //从S的pos位置起全部字符均后移 从 的 位置起全部字符均后移
S.ch[pos-1…pos+T.length-2] = T.ch[0…T.length-1]; //插入 ,略\0 插入T, 插入 //刷新 串长度 刷新S串长度 刷新
数据结构课程的内容
1/30
第四章 串
知识点:串的定义、表示与实现, 知识点:串的定义、表示与实现, 定位函数
2/30
第四章 串
1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式
4.1 串类型的定义 4.2 串的表示和实现 *4.3 串的模式匹配算法
3/30
4.1 串类型的定义
约定: 下标为0的分量存放串的长度 约定:1) 下标为 的分量存放串的长度 或 2)串值后加入一个不计入串长的结束标记字 串值后加入一个不计入串长的结束标记字 语言中的'\0' 符,如C语言中的 语言中的 串联接Concat(&T, S1, S2) 串联接
的串长为S1和 串长之和 串长之和, ∵是定长存储,联接后T的串长为 和S2串长之和,该长度可能会 是定长存储,联接后 的串长为 超出MAXSTRLEN 超出 ∴分情况处理,超出部分要“截断” 分情况处理,超出部分要“截断”
例:用“堆”实现串插入操作(教材P75)
Status StrInsert ( HString &S, int pos, HString T ){ //在串 的第pos个字符之前(包括尾部)插入串T 在串S的第 个字符之前(包括尾部)插入串 在串 的第 个字符之前 if (pos<1||pos>S.length+1) return ERROR; //pos不合法则告警 不合法则告警 if(T.length){ //只要串T不空 就需要重新分配S空间 以便插入T //只要串T不空,就需要重新分配S空间,以便插入T 空间, 只要串 不空, if (!(S.ch=(char*)realloc(S.ch, (S.length+T.length)*sizeof(char)) ( )) exit(OVERFLOW); for ( i=S.length-1; i>=pos-1; --i ) S.ch[i+T.length] = S.ch[i]; S.length + = T.length; } return OK;
6/30
4.1 串类型的定义-操作间的关系 操作间的关系
串的最小操作子集
赋值、求串长、比较、联接、取子串 赋值、求串长、比较、联接、
定位函数 Index(S, T, pos)
在主串中取从第i个字符起、长度和串 相等的子 在主串中取从第 个字符起、长度和串T相等的子 个字符起 串和T比较 若相等,则求得函数值为i, 比较, 串和 比较,若相等,则求得函数值为 ,否则值 直至S中不存在和串 相等的子串为止。 增1直至 中不存在和串 相等的子串为止。 直至 中不存在和串T相等的子串为止
4/30
4.1 串类型的定义
长度为零的串称为空串(Empty String),它不包含任何字符。 通常将仅由一个或多个空格组成的串称为空白串(Blank String) 注意:空串和空白串的不同,例如“ ”和“”分别表示长度为 1的空白串和长度为0的空串。 称两个串是相等的,当且仅当这两个串的值相等。 。 特别地,空串是任意串的子串,任意串是其自身的子串。
11/30
链式 存储
4.2 串的表示和实现-定长顺序存储
定长顺序存储表示----顺序映像 顺序映像 定长顺序存储表示
类型定义
typedef unsigned char SString[MAXSTRLEN+1]; SString s; //s是一个可容纳255个字符的顺序串。 //s是一个可容纳255个字符的顺序串。 是一个可容纳255个字符的顺序串
C中的字符串:一对双引号括起的字符序列,如“abcd ef” 中的字符串:一对双引号括起的字符序列, 如:S=“Data Structure”,S为串名,“Data Structure”为串值, , 为串名, 为串值, 长度为 ; 为主串S的子串,它在S中的位置为 中的位置 长度为14;“ata Str”为主串 的子串,它在 中的位置为2 为主串
评价 串长超出最大长度, 串长超出最大长度,约定采用截尾法 串长过小, 串长过小,则串空间浪费较大
14/30
4.2 串的表示和实现-堆分配存储
堆分配存储表示----顺序映像 顺序映像堆分配存储表示
类型定义
typedef struct { char *ch; int length; } HString; // 串值所在的存储区的起始地址 // 串长度
5/30
4.1 串类型的定义-ADT String
ADT String 串的整体操作
赋值 StrAssign(S, “Data Structure”) 复制 StrCopy(T, S) // T<=S, T为“Data Structure” 为 比较 StrCompare(S, T) 连接 Concat(T, “Data”, “Structure”) //T为“DataStructure” 为 ” 取子串 SubString(sub, S, 2, 5) // sub为“ata S” 为 子串在主串中的定位 Index(S, “a”, 3) // 4 子串置换 Replace(S, “a”, “b”) // S为“Dbtb Structure” 为 子串插入 StrInsert(S, 3, “aha”) // “Daahata Structure” 子串删除 StrDelete(S, 3, 5) // “Daructure”
8/30
0个或多个 个或多个 练1:串是由 S=’a1a2……an’ 为
字符组成的序列,一般记 。
个字符串: 练2:现有以下 个字符串: :现有以下4个字符串 a =‘BEI’ b =‘JING’ c = ‘BEIJING’
d = ‘BEI JING’
问:① 他们各自的长度? a =3,b =4,c = 7,d=8 他们各自的长度? , , , 是哪个串的子串? ② a是哪个串的子串?在主串中的位置是多少? 是哪个串的子串 在主串中的位置是多少? a是c和d的子串,在c和d中的位置都是 是 和 的子串 的子串, 和 中的位置都是 中的位置都是1 练3:空串和空白串有无区别? :空串和空白串有无区别? 答:有区别。空串(Null String)是指长度为零的串;而空白 有区别。空串(Null String)是指长度为零的串; 是指长度为零的串 String),是指包含一个或多个空白字符 是指包含一个或多个空白字符‘ 串(Blank String),是指包含一个或多个空白字符‘ ’(空 格键)的字符串. 格键)的字符串.
即字符串,是由零个或多个字符组成的有限序列, 串即字符串,是由零个或多个字符组成的有限序列,是数据 元素为单个字符的特殊线性表。 元素为单个字符的特殊线性表。 记为: s =‘ a1 , a2 , …….. , an’ (n≥0 ) 记为: 串名 串值(用‘ ’ 括起来) 串值( 括起来)
隐含结束符‘ 隐含结束符‘\0’ ,即 ASCII码NULL 码
14 4 ‘STUDENT’ ‘O’ 3 0 中没有t!) ( s中没有 !) 中没有
Replace(s, ‘STUDENT’,q)= ’I AM A WORKER’
10/30
4.2
串的表示和实现
首先强调:串与线性表的运算有所不同,是以“串的整体” 首先强调:串与线性表的运算有所不同,是以“串的整体”作 为操作对象,例如查找某子串, 为操作对象,例如查找某子串,在主串某位置上插入一个子串 等。 串有三种机内表示方法: 串有三种机内表示方法: 顺序 存储 定长顺序存储表示 ——用一组地址连续的存储单元存储串值的字 符序列 堆分配存储表示 ——用一组地址连续的存储单元存储串值的字 符序列,但存储空间是在程序执行过程中动态 分配而得。 串的块链存储表示 ——链式方式存储
13/30
4.2 串的表示和实现-定长顺序存储
求子串SubString(&Sub, S, pos, len)
合法的pos和len 合法的 和 pos>0 && len>=0 && pos<= S[0]-len+1 串的复制 Sub[1..len]=S[pos..pos+len-1]; Sub[0]=len;
若干术语: 若干术语: 串中字符个数(n≥0) 串中字符个数(n≥0). n=0 时称为空串 ∅ 。 串长: 串长: 空白串: 由一个或多个空格符组成的串。 空白串: 由一个或多个空格符组成的串。 中任意个连续的字符序列叫s的子串; S叫主串。 串s中任意个连续的字符序列叫s的子串; S叫主串。 子串: 子串: 子串位置: 子串的第一个字符的序号。 子串位置: 子串的第一个字符的序号。 字符位置: 字符在串中的序号。 字符位置: 字符在串中的序号。 串相等: 串长度相等,且对应位置上字符相等。 串相等: 串长度相等,且对应位置上字符相等。
相关文档
最新文档