数据结构课件-(4)[151页].ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构课件-(4)[151页].ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 151页 数据结构 课件 151
- 资源描述:
-
1、数据结构 第4章串1数据结构电子教案第4章串 数据结构 第4章串2内容提要串(即字符串)是一种特殊的线性表,它的每个结点仅由一个字符组成。随着计算机的发展,串在文字编辑、信息检索、词法扫描、符号处理及定理证明等许多领域得到越来越广泛的应用。很多高级语言都具有较强的串处理功能,C语言更是如此。本章将简要介绍串的有关概念和术语、详细介绍串的顺序存储方法和链接存储方法、串的基本运算及其实现、串的模式匹配概念和实现算法,最后通过几个简单实例介绍串的应用。数据结构 第4章串3第4章 串习题习题4 4数据结构 第4章串44.1 串的基本概念串串(或字符串字符串String)是由零个或多个字符组成的有限序列
2、,一般记为:s=“a0a1an-1”(n0)其中,s称为串名串名;用双引号括起来的字符序列称为串值串值;ai(0in1)称为串元素,是构成串的基本单位,它可以是英文字母、数字或其他字符;n称为串的长度长度,它表示串中字符的个数。不包含任何字符的串称为空串空串(Empty String),空串的长度为零。数据结构 第4章串5为了确定串与常数、标识符的区别,通常用定界符将串括起来,一般使用双引号,但定界符不是串的内容,例如,“”“”“#$%&”“12345678”“this is a string”“PROGRAM”注意:注意:上面这6个字符串均用双引号作为定界符,其中:“”是包括一个空格的字符串
3、,通常将一个或多个空格组成的串称为空格串空格串(Blank String)。“”是不包括任何字符的空串。数据结构 第4章串6当且仅当两个串的长度相等且各对应位置上的字符都相等时,则称这两个串是相等的相等的。一个串中任意个连续的字符组成的子序列称为该串的子串子串,包含子串的串相应地称为该子串的主串主串。例如:“a”、“ab”、“abcd”等都是主串“abcde”的子串。通常,字符在序列中的序号称为该字符在串中的位置位置,子串在主串中的位置是以子串的第一个字符在主串中的位置来表示的。例如,有两个字符串A和B分别为:A=“This is a string”B=“is”则A是主串,B是A的子串。B在A
4、中出现了两次,其中首次出现的位置为3,因此,称B在A中的序号(或位置)是3。数据结构 第4章串7为了对字符串进行处理,程序设计语言中常常需要使用两种串:一种为串常量串常量,另一种为串串变量变量。和整数常量、实数常量一样,在程序执行过程中,只能被引用而不能改变其值,常用直接量来表示。和其它类型的变量一样,它必须用名字来标识,在程序执行过程中,其值是可以改变的,但串变量与其它类型变量不同的是:不能使用赋值语句对其进行赋值运算。C语言规定,字符串存储时,每个字符在内存中占用一个字节,并用特殊字符0作为字符串的结束标记。因此,字符串在计算机中实际占用空间比串长多1个字符。数据结构 第4章串8数据结构
5、第4章串9串的存储方法与线性表的存储方法类似。串的存储结构与计算机系统的具体编址方式有着十分密切的关系,它对串的处理效率影响相当大。因此,要根据不同的情况,综合考虑各种因素,选择合适的方法来存储串。此外,由于串是由单个字符组成的,所以存储时有一些特殊的技巧。常用的串的存储方式有:顺序存储结构、链接存储结构和索引存储结构。为简单起见,本节仅介绍字符串的两种存储方法:顺序存储结构和链接存储结构。数据结构 第4章串10串的顺序存储结构的串简称为顺序串顺序串。顺序串是用一组地址连续的存储单元依次存放串中各个字符。但不同的计算机系统对串的顺序存储方式的实现可能不同。在按字节存取的计算机中,由于一个字符只
6、占用一个字节,因此,字符串中相邻的字符是顺序存放在相邻的字节中,这样既节约存储空间,处理又很方便。如图4.1所示。在按字存取的计算机中,串的顺序存储方式有两种:非紧缩存储方式和紧缩存储方式数据结构 第4章串11图4.1 字节编址方式下字符串s的顺序存储方式示意图【例4.1】设字符串s=“data structures”,请给出字节编址方式下字符串s的顺序存储结构。【解】图4.1是字节编址方式下字符串s的顺序存储结构示意图。数据结构 第4章串12 1 1、顺序串的非紧缩存储方式、顺序串的非紧缩存储方式非紧缩存储方式以字为单位顺序存储字符串的每个字符,即一个存储单元只存储一个字符。若字符串的长度为
7、n,则需要n个字的存储单元。如图4.2所示。【例4.2】假设某机器字的存储单元有4个字节,那么一个字可存放4个字符。若字符串s=“data structures”,请给出非紧缩存储方式下字符串s的顺序存储结构。【解】图4.2是字编址方式下,字符串s的非紧缩存储方式示意图,图中的阴影部分为空闲字节。数据结构 第4章串13图4.2 字编址方式下字符串s的非紧缩存储方式示意图 数据结构 第4章串14 2 2、顺序串的紧缩存储方式、顺序串的紧缩存储方式紧缩存储方式以字节为单位顺序存储字符串的每个字符,根据机器字的长度,紧缩存储方法尽可能地将多个字符存放在一个字中。假设某机器字的存储单元包含有4个字节,
8、则一个字可存放4个字符。若字符串的长度为n,则需要n/4个字的存储单元。这样,最后一个单元不一定都能完全利用上,可填充如空格之类的特殊字符或结束字符。如图4.3所示。数据结构 第4章串15【例4.3】假设计算机一个字的存储单元为4个字节,那么一个字可以存放4个字符。若字符串s=“data structures”,请给出紧缩存储方式下字符串s的顺序存储结构。【解】图4.3是字编址方式下,字符串s的紧缩存储方式示意图。图4.3 字编址方式下字符串s的紧缩存储方式示意图 数据结构 第4章串163 3、两种存储方式的分析和比较、两种存储方式的分析和比较串的紧缩存储方式可以节约存储空间,但处理单个字符不
9、太方便,运算效率较低,因为它需要花费较多时间分离同一个字中的字符;非紧缩存储方式浪费存储空间,但处理单个字符或一组连续的字符较为方便。总的来说,紧缩方式的优势较显著,所以多数计算机语言和软件都是采用紧缩方式存储字符串的。这两种方式的共同缺点是:插入一个字符和删除一个字符的运算很难,因为要移动其他元素,才能实现插入和删除运算。这也是顺序存储方法的共同缺点。数据结构 第4章串17 在字节编址方式和非紧缩格式的字编址中,顺序串可用高级语言的字符数组来实现:#define STRMAX 64 /*每个字符串的最大长度*/char sSTRMAX;/*用字符数组s存储串中所有字符*/在实际编程时,可在串
10、的结尾放置一个特定的、不会出现在串中的字符作为串的终止符,以表示串的结束。数据结构 第4章串18例如,C语言中以0作为串的终止符。若不设置终止符,可用一个整数slen表示字符串的实际长度,slen-1表示串中最后一个字符的存储位置。顺序串的类型定义与顺序表类似,可定义为:#define STRMAX 64typedef struct node char dataSTRMAX;int slen;seqstring;/*seqstring为顺序串的类型*/数据结构 第4章串194.2.2 4.2.2 串的链接存储结构串的链接存储结构 1一般的链接存储方法采用链接存储结构的串称为链串链串。把线性表的
11、链接存储方式应用到字符串的存储上就得到串的链接存储结构。链串与链表的差异仅在于其结点的数据域为字符类型。图4.4就是一个字符串链接存储结构的示意图。数据结构 第4章串20图图4.4 4.4 字符串的链接存储结构示意图字符串的链接存储结构示意图 数据结构 第4章串21便于字符的插入和删除运算。串的链接存储结构的缺点串的链接存储结构的缺点:由于每个字符都需要一个结点来存放,使得链表中的结点数相当多,存储空间的利用率很低。此外,访问链串的子串比访问顺序串的子串效率要低,它需要从头沿着链表依次扫描到希望的子串的开始元素,然后进一步沿着指针获得子串的后继元素。数据结构 第4章串22 2改进的链接存储方法
12、改进的链接存储方法是:让链表中每个结点存放多个字符。通常,将链表中每个结点数据域存储的字符个数称为结点的大小。假设每个结点存放m个字符,当结点大小m1(例如m=4)时,串的长度不一定正好是结点大小m的整数倍,链串最后一个结点的各个数据域不一定总能全被m个字符占满。此时,应在每个串的末尾还没有被占用的数据域里加上一个不属于字符集的特殊符号作为串的结束标志(例如0或),以表示串的结束,见图4.4(b)中最后一个结点。数据结构 第4章串23 例如,图4.4(a)所示是结点大小为1的链串,图4.4(b)所示则是结点大小为4的链串。【例4.4】假设字符串s1=“program”,s2=“data str
13、uctures”,若用结点大小为1的链串表示s1,用结点大小为4的链串表示s2,请分别给出s1和s2的链接存储结构。【解】图4.4所示是字符串s1和s2的链接存储结构示意图。图4.4(a)是链串s1,其结点大小m=1。若指针占用4个字节,字符数据域占用1个字节,则链串s1的存储密度为20%。图4.4(b)所示是结点大小m=4的链串s2,其存储密度达到了50%。数据结构 第4章串24显然,改进的串的链接存储方法是顺序存储和链接存储方法的折中方案。链串结点大小的选择与顺序串的格式选择类似。结点大小越大,存储密度越大。虽然提高结点的大小会使其存储密度增大,但是,进行插入和删除运算时,可能会引起大量的
14、字符移动,给运算带来不便,因此,它适用于串基本不变的情况下使用。例如,在图4.4(b)所示的字符串s2的第6个字符之后插入一个字符串“xxy”时,从s2第6个字符开始依次向后移动9个字符,其结果如图4.4(c)所示。结点大小越小(如结点大小为1时),运算处理方便,但其存储密度下降。为简单起见,我们常常把链串结点的大小规定为1。数据结构 第4章串25链串和单链表的差异仅在于其结点的数据域为字符类型。链串中每个结点有两个域:数据域data存放一个字符或一个字符串(对于结点大小不为1的链串),指针域next存放指向下一个结点的指针。一个链串则由头指针head惟一确定。数据结构 第4章串26对于结点大
15、小为1的链串,其类型定义如下:/*链串结点大小为1的结点类型*/typedef struct strnode char data;/*data为结点的数据域*/struct strnode *next;/*next为指针域*/linkstring;/*linkstring为链串类型*/linkstring *head;/*head是链串的头指针*/数据结构 第4章串27对于结点大小不为1的链串,其类型定义为:/*NODESIZE为链串结点的大小,由用户自定义*/#define NODESIZE 4typedef struct strnodem char dataNODESIZE;/*data为
16、结点数据域*/struct strnodem*next;/*next为指针域*/linkstringnode;/*linkstringnode是结点大小为m的链串类型*/数据结构 第4章串28数据结构 第4章串294.3.1 串的基本运算 假设假设s1=“a1a2an”,s2=“b1b2bm”,其中其中1mn。(1)串赋值strassign(s,t):将一个串常量或串变量t赋给串变量s。(2)求串长strlen(s):求s串的长度,即统计串中字符个数,函数返回一个整数。(3)串连接strcat(s1,s2):将两个串首尾连接在一起形成一个新串,例如,s=strcat(s1,s2),则s=“a1
17、a2anb1b2bm”。数据结构 第4章串30(4)串比较strcmp(s1,s2):比较两个字符串的大小。若s1s2,则函数返回一个负数或1;若s1s2,则函数返回一个正数或1;若s1=s2,则函数返回0。(5)串插入串插入insert(s1,i,s2):在串s1第i个字符位置之后插入字符串s2,例如,执行insert(s2,3,“THIS”)后,s2=“b1b2b3THISb4bm”。(6)串删除串删除delete(s,i,j):从串s第i个字符开始,连续删除j个字符。若不足j个字符,则删除到s的最后一个字符。例如,s=“good lucky to you!”,执行delete(s,6,6
18、)后,s=“good to you!”。数据结构 第4章串31(7)串替换replace(s1,i,j,s2):用串s2替换串s1中从第i个字符开始的连续j个字符,例如,执行replace(s1,2,3,“abc”)后,则串s1=“a1abca5a6an”。(8)串复制strcpy(s1,s2):将s2的串值复制到串s1中。(9)取子串substr(s1,i,j,s2):从串s1第i个字符开始,取连续j个字符构成一个新串s2,其中,1istrlen(s1),1jstrlen(s1)i+1。例如,s=“abcdefgh”,则substr(s,3,4)=“cdef”。(10)子串定位index(s
19、1,s2,i):其功能是求子串在主串中的位置。在主串中查找是否有与子串匹配的序列,若有,则给出子串在主串中首次出现的位置;若无,则返回0。数据结构 第4章串324.3.2 4.3.2 顺序串上基本运算的实现顺序串上基本运算的实现(1)顺序串的赋值函数S_strassign(s):将从键盘输入的一串字符变量赋给串变量s。/*顺序串建立函数,从键盘输入字符串赋给顺序串变量s*/void S_strassign(s)seqstring*s;char c;int j=1;printf(nntt请输入一个字符串,以#作为结束:);scanf(%c,&c);while(c!=#&jdataj=c;j+;s
20、canf(%c,&c);s-dataj=0;s-slen=j-1;/*S_STRASSIGN*/数据结构 第4章串33(2)求顺序串的长度函数S_strlen(s):求顺序串s的长度。/*求顺序串长度函数*/int S_strlen(s)seqstring*s;printf(nt顺序串长度length=%dn,s-slen);return(s-slen);/*返回顺序串的长度*/*S_STRLEN*/数据结构 第4章串34(3)顺序串的比较函数S_strcmp(s1,s2):比较两个顺序串的大小。若s1=s2,则函数返回0;若s1s2,则函数返回正数;若s1s2,则函数返回负数。/*两个顺序串
21、比较函数,函数返回值为0、正数或负数*/int S_strcmp(s1,s2)seqstring*s1,*s2;int i=0,flag=1,m=0,n1,n2;n1=S_strlen(s1);n2=S_strlen(s2);while(flag=1)&(i=n1)&(idatai!=s2-datai)flag=0;if(flag=1)&(in1)&(in2)m=0;else m=s1-datai-s2-datai;return(m);/*S_STRCMP*/数据结构 第4章串35(4)顺序串的连接函数)顺序串的连接函数S_strcat(s1,s2):将顺序串将顺序串s2连到连到s1之后形成一
22、个新串。之后形成一个新串。/*顺序串连接函数,将顺序串s2与s1连成一个新串*/int S_strcat(s1,s2)seqstring*s1,*s2;int i,j,k;i=S_strlen(s1);j=S_strlen(s2);if(i+j)MAX)return(1);for(k=1;kdatai+k=s2-datak;s1-datai+j+1=0;s1-slen=i+j;printf(nt两个顺序串连接后的新串长度length=%dn,s1-slen);return(0);/*S_STRCAT*/数据结构 第4章串36(5)顺序串的插入函数)顺序串的插入函数S_strinsert(s,i
23、,t):将字符串将字符串t常量插到常量插到s串中,从串中,从s串第串第i个字符位置开始插入。个字符位置开始插入。/*顺序串的插入函数,从s串第i个位置开始插入t串*/int S_strinsert(s,i,t)seqstring*s,*t;int i;int ns,nt,k,j;ns=s-slen;nt=t-slen;if(ins+1|ns+ntMAX)return(1);k=ns+nt+1;for(j=ns+1;j=i;k-,j-)s-datak=s-dataj;for(k=1;kdata!=0;k+)s-datai+k-1=t-datak;s-slen=ns+nt;return(0);/*
24、S_STRINSERT*/数据结构 第4章串37(6)顺序串的删除函数)顺序串的删除函数S_strdelete(s,t):从顺序从顺序串串s中删除与串中删除与串t相同的子串。相同的子串。/*顺序串删除函数,从顺序串s中删除与t串相同的子串*/int S_strdelete(s,t)seqstring*s,*t;int ns,nt,k=0,ks=0,kt=0,j,flag;ns=s-slen;nt=t-slen;if(ntns|ns0|nt0)return(1);while(k=ns)&(ktdataks+=t-datakt+)if(s-dataks!=t-datakt)flag=0;/*whi
25、le*/数据结构 第4章串38/*顺序串删除函数,从顺序串s中删除与t串相同的子串*/if(ktnt)&(k=ns)for(j=k;jdataj=s-dataj+nt;s-slen=ns-nt;s-datas-slen+1=0;return(0);/*IF*/*删除成功,函数返回成功信息0*/else return(1);/*删除失败,返回错误信息1*/*S_STRDELETE*/数据结构 第4章串39(7)求顺序串的子串函数)求顺序串的子串函数S_substr(s,i,k,t):从顺从顺序串序串s中第中第i个字符开始连续取个字符开始连续取k个字符存放到顺序存个字符存放到顺序存储的子串储的子串
展开阅读全文