数据结构(严蔚敏)学习课件第4章.ppt
《数据结构(严蔚敏)学习课件第4章.ppt》由会员分享,可在线阅读,更多相关《数据结构(严蔚敏)学习课件第4章.ppt(90页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四章 串,【课前思考】,从数据结构的观点来说,串是一种特殊的线性表;但就数据类型而言,串不是线性表。,希望你带着这个问题开始这一章的学习,并能在学完这一章的内容之后能得出正确的结论。,【学习目标】,1. 理解“串”类型定义中各基本操作的特点,并能正确利用它们进行串的其它操作。 2. 理解串类型的各种存储表示方法。 3. 理解串匹配的各种算法。,【重点和难点】,相对于其它各个知识点而言,本章非整个课程的重点,鉴于串已是多数高级语言中已经实现的数据类型,因此本章重点仅在于了解串类型定义中各基本操作的定义以及串的实现方法,并学会利用这些基本操作来实现串的其它操作。本章的难点是理解实现串匹配的KMP
2、算法的思想,但它不属本章学习的基本要求,更不是重点学习内容。,【知识点】,串的类型定义、串的存储表示、串匹配、KMP算法,【学习指南】,虽然目前各常用的高级语言中都已经实现了串类型,但由于它是通过软件实现的,因此作为一个软件工作者还是应该了解串的实现方法。本章没有必须完成的算法设计题,如果有兴趣可以试试以下几个题:4.10,4.11,4.13,4.17,4.18,4.23,4.28,4.30。其中前6个是练习串的基本操作的应用,后2个是和KMP算法相关的练习。,4.1 串类型的定义,4.2 串的表示和实现,4.3串的模式匹配算法,4.1串的类型定义,一、 基本概念,1串的定义 串( strin
3、g) 是由零个或多个字符组成的有限序列,记作s=a1a2an,其中s为串的名字,用成对的单引号括起来的字符序列为串的值,但两边的引号不算串值,不包含在串中。ai(1in)可以是字母、数字或其它字符。 n为串中字符的个数,称为串的长度。,2空串 不含任何字符的串称为空串,它的长度n=0,记为s=。,3空格串 含有一个或多个空格的串,称为空格串,它的长度n为空格的个数,一般用符号“ ”表示空串。,串是有限长的字符序列,由一对单引号相括,如: a string,4子串、主串 通常将字符在串中的序号称为该字符在串中的位置。子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。 若一个串是另一个串
4、中连续的一段,则这个串称为另一个串的子串,而另一个串相对于该串称为主串。例如,串s1=“abcdefg”,s2=“fabcdefghxyz”,则s1为s2的子串,s2相对于s1为主串。,另外,空串是任意串的子串,任意串是自身的子串。若一个串的长度为n,则它的子串数目为 +1,真子串个数为 (除串本身以外的子串都称为真子串)。 当且仅当两个串的值相等时,称这两个串是相等的,即只有当两个串的长度相等, 并且每个对应位置的字符都相等时才相等。,二、串的抽象数据类型的定义如下:,ADT String ,数据对象:,D ai |aiCharacterSet, i=1,2,.,n, n0 ,数据关系:,R
5、1 | ai-1, ai D, i=2,.,n ,基本操作:,StrAssign ( 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,又如串的置换函数: Replace( / 0号单元存放串的长度,或: typedef struct /* 串结构定义 */ char chMAXLEN; int len; SStr
6、ing;,按这种串的表示方法实现的串的运算时,其基本操作为 “字符序列的复制”。,串的实际长度可在这个予定义长度的范围内随意设定,超过予定义长度的串值则被舍去,称之为 “截断” 。,特点:,Status Concat(SString S1, SString S2, SString / Concat,例如:串的联接算法中需分三种情况处理:,T1.S10 = S11.S10; TS10+1.S10+S20 = S21.S20; T0 = S10+S20; uncut = TRUE; ,if (S10+S20 = MAXSTRLEN) / 未截断,else if (S10 MAXSTRSIZE) /
7、 截断,else / 截断(仅取S1),T1.S10 = S11.S10; TS10+1.MAXSTRLEN = S21.MAXSTRLENS10; T0 = MAXSTRLEN; uncut = FALSE; ,T0.MAXSTRLEN = S10.MAXSTRLEN; / T0 = S10 = MAXSTRLEN uncut = FALSE; ,(1) 串插入函数。 StrInsert(s, pos, t) /*在串s中序号为pos的字符之前插入串t */ SString *s, t; int pos; int i; if (poss-len) return(0); /* 插入位置不合法
8、*/ if (s-len + t.lenlen + t.len-1;i=t.len + pos;i-) s-chi=s-chi-t.len; for (i=0;ichi+pos=t.chi; s-len=s-len+t.len; ,定长顺序存储的操作实施:,【算法 串插入函数】,else if (pos+t.lenMAXLEN, 但串t的字符序列可以全部插入 */ for (i=MAXSTRLEN-1;it.len+pos-1;i-) s-chi=s-chi-t.len; for (i=0;ichi+pos=t.chi; s-len=MAXLEN; else /* 串t的部分字符序列要舍弃 *
9、/ for (i=0;ichi+pos=t.chi; s-len=MAXSTRLEN; return(1); ,(2) 串删除函数。 StrDelete(s, pos, len) /* 在串s中删除从序号pos起len个字符 */ SString *s; int pos, len; int i; if (pos(s-len-len) return(0); for (i=pos+len;ilen;i+) s-chi-len=s-chi; s-len=s-len - len; return(1); ,【算法 串删除函数】,(3) 串复制函数。 StrCopy(s, t) /* 将串t的值复制到串s
10、中 */ SString *s, t; int i; for (i=0;ichi=t.chi; s-len=t.len; ,【算法 串复制函数】,(4) 判空函数。 StrEmpty(s) /* 若串s为空(即串长为0), 则返回1, 否则返回0 */ SString s; if (s.len=0) return(1); else return(0); ,【算法 判空函数】,(5) 串比较函数。 StrCompare(s, t) /* 若串s和t相等, 则返回0;若st,则返回1;若st,则返 回-1 */ SString s, t; int i; for (i=0;is.len ,【算法 串
11、比较函数】,(6) 求串长函数。 StrLength(s)/* 返回串s的长度 */ SString s; return(s.len); ,【算法 求串长函数】,(7) 清空函数。 StrClear(s) /* 将串s置为空串 */ SString *s; s-len=0; return(1); ,【算法 清空函数】,(8) 连接函数。 Concat(s, t) /* 将串t连接在串s的后面 */ SString *s, t; int i, flag; if (s-len + t.lenlen; ilen + t.len; i+) s-chi=t.chi-s-len; s-len+=t.len
12、;flag=1; ,else if (s-lenlen;ichi=t.chi-s-len; s-len=MAXSTRLEN;flag=0; else flag=0;/* 串s的长度等于MAXLEN, 串t不被连接 */ return(flag); ,【算法 连接函数】,(9) 求子串函数。 SubString(sub, s, pos, len) /* 将串s中序号pos起len个字符复制到sub中 */ SString *sub, s; int pos, len; int i; if (poss.len | lens.len-pos) sub-len=0;return(0); else for
13、 (i=0;ichi=s.chi+pos; sub-len=len;return(1); ,【算法 求子串函数】,(10) 定位函数。 StrIndex(s, pos, t) /* 求串t在串s中的位置 */ SString s, t; int pos; int i, j; if (t.len=0) return(0); i=pos;j=0; while (i=t.len) return(i-t.len); else return(0); ,【算法 定位函数】,typedef struct char *ch; / 若是非空串,则按串长分配存储区, / 否则ch为NULL int length;
14、 / 串长度 HString;,二、串的堆分配存储表示,特点:仍用一组地址连续的存储单元存储串的字符序列,但其存储空间是在程序执行过程中动态分配而得。,通常,C语言中提供的串类型就是以这种存储方式实现的。系统利用函数malloc( )和free( )进行串值空间的动态管理,为每一个新产生的串分配一个存储区,称串值共享的存储空间为“堆”。 C语言中的串以一个空字符为结束符, 串长是一个隐含值。,这类串操作实现的算法为: 先为新生成的串分配一个存储空间,然后 进行串值的复制。,Status Concat(HString / Concat,Status SubString(HString / Sub
15、String, ,Sub.ch = (char *)malloc(len*sizeof(char); Sub.ch0.len-1 = Spos-1.pos+len-2; Sub.length = len;,三、串的块链存储表示,也可用链表来存储串值,由于串的数据元素是一个字符,它只有 8 位二进制数,因此用链表存储时,通常一个结点中存放的不是一个字符,而是一个子串。,存储密度 =,数据元素所占存储位,实际分配的存储位,#define CHUNKSIZE 80 / 可由用户定义的块大小 typedef struct Chunk / 结点结构 char chCHUNKSIZE; struct Ch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 蔚敏 学习 课件
限制150内