数据结构-第四章课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构-第四章课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第四 课件
- 资源描述:
-
1、数据结构课程的内容数据结构课程的内容第第4章章 串(串(String)4.2 4.2 串的表示和实现串的表示和实现4.3 4.3 串的模式匹配算法串的模式匹配算法1. 定义定义2. 逻辑结构逻辑结构3. 存储结构存储结构4. 运算规则运算规则5. 实现方式实现方式4.1 4.1 串类型的定义串类型的定义串串即字符串,是由零个或多个字符组成的有限序列,是数据即字符串,是由零个或多个字符组成的有限序列,是数据元素为单个字符的特殊线性表。元素为单个字符的特殊线性表。4.1 4.1 串类型的定义串类型的定义记为:记为: s = a1 , a2 , . , an (n0 ) 串名串名串值(用串值(用 括
2、起来)括起来)隐含结束符隐含结束符0 ,即即ASCII码码NULL说明:串是一种在数据元素的组成上具有一定约束条件的说明:串是一种在数据元素的组成上具有一定约束条件的线性表,即要求组成线性表的所有数据元素都是字符(字线性表,即要求组成线性表的所有数据元素都是字符(字母、数字或其他字符),所以,人们经常这样定义串:串母、数字或其他字符),所以,人们经常这样定义串:串是一个有穷字符序列。是一个有穷字符序列。4若干术语:若干术语:串长:串长:空白串:空白串:子串:子串:子串位置:子串位置:字符位置:字符位置:串相等:串相等:串中字符个数(串中字符个数(n0n0). n=0 . n=0 时称为空串时称
3、为空串 。由一个或多个空格符组成的串。由一个或多个空格符组成的串。串串s s中任意个连续的字符序列叫中任意个连续的字符序列叫s s的子串的子串; S; S叫叫主串主串。子串的第一个字符的序号。子串的第一个字符的序号。字符在串中的序号。字符在串中的序号。串长度相等,且对应位置上字符相等。串长度相等,且对应位置上字符相等。 注:空串是任意串的子串。任意串是其自身的子串。注:空串是任意串的子串。任意串是其自身的子串。5串常量和串变量串常量和串变量通常在程序中使用的串可分为:串常量和串变量。通常在程序中使用的串可分为:串常量和串变量。串变量:串变量和其它类型的变量一样,其值是可以改变的。串变量:串变量
4、和其它类型的变量一样,其值是可以改变的。 串常量:串常量和整常数、实常数一样,在程序中只能被引用串常量:串常量和整常数、实常数一样,在程序中只能被引用但不能改变其值。即只能读不能写。但不能改变其值。即只能读不能写。 串常量由直接量来表示的:串常量由直接量来表示的: 【例】【例】Error(“overflow”)中)中“overflow”是直接量。是直接量。串常量命名串常量命名 有的语言允许对串常量命名,以使程序易读、易写。有的语言允许对串常量命名,以使程序易读、易写。 【例】【例】C+中,可定义串常量中,可定义串常量path const char path=dir/bin/appl; 练练1:
5、串是由串是由 字符组成的序列,一般记字符组成的序列,一般记为为 。练练2:现有以下现有以下4个字符串:个字符串:a =BEI b =JING c = BEIJING d = BEI JING问:问: 他们各自的长度?他们各自的长度? a是哪个串的子串?在主串中的位置是多少?是哪个串的子串?在主串中的位置是多少?a =3,b =4,c = 7,d=8a是是c和和d的子串,在的子串,在c和和d中的位置都是中的位置都是1练练3:空串和空白串有无区别?空串和空白串有无区别?答:答:有区别。空串有区别。空串(Null String)(Null String)是指长度为零的串;而空白是指长度为零的串;而空
6、白串串(Blank String),(Blank String),是指包含一个或多个空白字符是指包含一个或多个空白字符 ( (空空格键格键) )的字符串的字符串. .0个或多个个或多个S=a1a2anADT StingObjects: D=ai | aiCharacterSet, i=1, 2,,n, n0Relations: R1= | ai-1,ai D, i=2, ,nfunctions: / 有有1313种之多种之多StrAssign(&T, chars) / 串赋值,生成值为串赋值,生成值为charschars的串的串T TStrCompare(S,T) / 串比较,若串比较,若ST
7、ST,返回值大于,返回值大于0 0 StrLength(S) / 求串长,即返回求串长,即返回S S的元素个数的元素个数 Concat(&T, S1, S2) / 串连接,用串连接,用T T返回返回S1S1S2S2的新串的新串SubString(&Sub, S, pos, len) / 求求S S中中pospos起长度为起长度为lenlen的子串的子串Index(S, T, pos) / 返回子串返回子串T T在在pospos之后的位置之后的位置 Replace(&S, T,V) / 用子串用子串V V替换子串替换子串T TADT Sting串的抽象数据类型定义(串的抽象数据类型定义(参见教材
8、参见教材P71)最最小小操操作作子子集集 设设 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)=Replace(s, STUDENT,q)=144STUDENTO30 ( s中没有中没有t!)!)I AM A WORKER再问:再问:Concat(SubString(s,6,2), Concat(t,SubString(s,7,8) ?4.2串的表示和实现串的表示和实
9、现 定长顺序存储表示定长顺序存储表示用一组地址连续的存储单元存储串值的字用一组地址连续的存储单元存储串值的字符序列符序列 堆分配存储表示堆分配存储表示用一组地址连续的存储单元存储串值的字用一组地址连续的存储单元存储串值的字符序列符序列, ,但存储空间是在程序执行过程中动态但存储空间是在程序执行过程中动态分配而得。分配而得。 串的块链存储表示串的块链存储表示链式方式存储链式方式存储首先强调:首先强调:串与线性表的运算有所不同,是以串与线性表的运算有所不同,是以“串的整体串的整体”作作为操作对象,例如查找某子串,在主串某位置上插入一个子串为操作对象,例如查找某子串,在主串某位置上插入一个子串等。串
10、有三种机内表示方法:等。串有三种机内表示方法:顺序顺序存储存储链式链式存储存储定长顺序存储特点:定长顺序存储特点:用一组连续的存储单元来存放串,直用一组连续的存储单元来存放串,直接使用定长的字符数组来定义,数组的接使用定长的字符数组来定义,数组的上界预先给出上界预先给出,故,故称为静态存储分配称为静态存储分配。例如:例如:#define Maxstrlen 255 /用户可用的最大串长用户可用的最大串长 typedef unsigned char SString Maxstrlen1 ;SString s; /s是一个可容纳是一个可容纳255个字符的顺序串。个字符的顺序串。注:注:一般用一般用
11、SString0来存放串长信息;来存放串长信息;C语言约定在串尾加结束符语言约定在串尾加结束符 0,以利操作加速,但不计入串长;,以利操作加速,但不计入串长;若字符串超过若字符串超过Maxstrlen 则自动截断(因为静态数组存不则自动截断(因为静态数组存不 进去)。进去)。 讨论:想存放超长字符串怎么办?讨论:想存放超长字符串怎么办?静态数组有缺陷!静态数组有缺陷!实现方式:参见教材实现方式:参见教材P73编程两例,两串连接和编程两例,两串连接和求子串求子串改用动态分配的一维数组改用动态分配的一维数组“堆堆”!例:例:用顺序存储方式实现求子串函数用顺序存储方式实现求子串函数SubString
12、(&Sub, S, pos, len) Status SubString(SString &sub, SString S, int pos, int len ) if(posS0 | lenS0-pos+1) return ERROR; /pos不合法则告警不合法则告警 Sub1len=Spospos+len-1; Sub0=len; return OK;将串将串S S中从第中从第pospos个字符开始长度为个字符开始长度为lenlen的字符序列复的字符序列复制到串制到串SubSub中中(注:串(注:串SubSub的预留长度与的预留长度与S S一样)一样)s = a1 , a2 , . , a
13、nn串长串长poslen思路:思路:利用利用mallocmalloc函数合理预设串长空间。函数合理预设串长空间。特点:特点: 若在操作中串值改变,还可以利用若在操作中串值改变,还可以利用reallocrealloc函数按新函数按新串长度串长度增加增加( (堆砌堆砌) )空间。空间。Typedef struct char *ch; / 若非空串若非空串,按串长分配空间按串长分配空间; 否则否则 ch = NULLint length; /串长度串长度HString堆分配存储特点:堆分配存储特点:仍用一组连续的存储单元来存放串,仍用一组连续的存储单元来存放串,但存储空间是在程序执行过程中动态分配而
14、得。但存储空间是在程序执行过程中动态分配而得。约定:约定:所有按堆存储的串,其关键信息放置在:所有按堆存储的串,其关键信息放置在:Status StrInsert ( HString &S, int pos, HString T ) /在串在串S的第的第pos个字符之前(包括尾部)插入串个字符之前(包括尾部)插入串Tif (posS.length+1) return ERROR; /pos不合法则告警不合法则告警 if(T.length) /只要串只要串T不空,就需要重新分配不空,就需要重新分配S空间,以便插入空间,以便插入T if (!(S.ch=(char*)realloc(S.ch, (
15、S.length+T.length)*sizeof(char) ) exit(OVERFLOW); for ( i=S.length-1; i=pos-1; -i ) /为插入为插入T而腾出而腾出pos之后的位置之后的位置 S.chi+T.length = S.chi; /从从S的的pos位置起全部字符均后移位置起全部字符均后移 S.chpos-1pos+T.length-2 = T.ch0T.length-1; /插入插入T,略,略0 S.length + = T.length; /刷新刷新S串长度串长度return OK;/StrInsert例:例:用用“堆堆”实现串插入操作实现串插入操作
16、(教材教材P75) Status StrAssign(HString &T, char *chars)if (T.ch) free(T.ch);for (i=0, c=chars; c; +i, +c); /求串长度求串长度if (!i) T.ch = NULL; T.length = 0;else if (!(T.ch = (char*)malloc(i*sizeof(char) exit(OVERFLOW); T.ch0.i-1 = chars0.i-1; T.length =i;Return OK;/StrAssign指针变量指针变量C也可以自增!也可以自增!意即每次后移一个数据意即每次
17、后移一个数据单元。单元。附:堆分配存储表示附:堆分配存储表示直到终值为直到终值为“假假”停止,串尾特征是停止,串尾特征是0NULL=0显然,若显然,若数据元素很多,用法数据元素很多,用法2 2存储更优存储更优称为称为块链结构块链结构链式存储特点链式存储特点 :用链表存储串值,易插入和删除。用链表存储串值,易插入和删除。法法1 1:链表结点(数据域)大小取链表结点(数据域)大小取1 1法法2 2:链表结点(数据域)大小取链表结点(数据域)大小取n(n(例如例如n=4)n=4) A B C I NULLheadheadA B C D E F G H I # # # NULL16headA B C
18、D E F G H I J # # NULLheadA B C X F G H I Y Z D E J # # # NULL虽然提高结点的大小使得存储密度增大,但是做插入、删除运虽然提高结点的大小使得存储密度增大,但是做插入、删除运算时,可能会引起大量字符的移动,给运算带来不便。算时,可能会引起大量字符的移动,给运算带来不便。 #define CHUNKSIZE 80 /可由用户定义的块大小可由用户定义的块大小typedef struct Chunk /首先定义结点类型首先定义结点类型 char ch CHUNKSIZE ; /结点中的数据域结点中的数据域 struct Chunk * nex
19、t ; /结点中的指针域结点中的指针域Chunk; 块链类型定义:块链类型定义:例略例略typedef struct /其次定义用链式存储的串类型其次定义用链式存储的串类型 Chunk *head; /头指针头指针 Chunk *tail; /尾指针尾指针 int curLen; /结点个数结点个数 Lstring; 再次强调:再次强调:串与线性表的运算有所不同,是以串与线性表的运算有所不同,是以“串的串的整体整体”作为操作对象,例如查找某子串,在主串某位作为操作对象,例如查找某子串,在主串某位置上插入一个子串等。置上插入一个子串等。这类操作中均涉及到这类操作中均涉及到定位问题定位问题,称为,
展开阅读全文