当前位置:文档之家› 数据结构《第4章 串存储与基本操作的实现》

数据结构《第4章 串存储与基本操作的实现》

第四章串存储与基本操作的实现本章学习要点◆熟悉串的相关概念以及串与线性表的关系◆重点掌握串的定长存储、堆分配存储的表示方法与基本操作的实现◆了解串的各种存储结构,能根据需要合理选用串的存储结构解决实际问题“串”(string),是字符串的简称,它是一种特殊的线性表,其特殊性在于组成线性表的数据元素是单个字符。

字符串在计算机处理实际问题中使用非常广泛,比如人名、地名、商品名、设备名等均为字符串。

同样在文字编辑、自然语言理解和翻译、源程序的编辑和修改等方面,都离不开对字符串的处理。

4.1串的基本概念4.1.1串的概念1.串的定义串(string)是由n个字符组成的有限序列,记为:S=”a0a1a2…a n-1” (n≥0)。

其中,S是串的名字,字符序列a0a1a2…a n-1是串的值,a i(0≤i≤n-1)可以是字母、数字或其他字符元素;由于在C语言系统中数组元素的下标是从0开始的,所以串中所含元素的序号等于该元素的下标值加1;串中所含字符的个数n称为该串的长度,长度为0的字符串称为空串(null string)。

从串的定义可以看出,串实际上是数据元素为字符的特殊的线性表。

例如:(1)A=“X123” (长度为4的串)(2)B=“12345654321” (长度为11的串)(3)C=“Bei Jing” (长度为8的串)(4)D=“” (长度为0的空串)(5)E=“This is a string” (长度为16的串)(6)F=“ is a ” (长度为6的串)2.子串、主串和位置串中任意连续的字符组成的子序列称为该串的子串;相应地,包含子串的串称为主串。

串中的字符在串序列中的序号称为该字符在该串中的位置;子串的第一个字符在主串中的位置称为子串在主串中的位置。

显然,串为其自身的子串,并规定空串为任何串的子串。

显然,在不考虑空子串的情况下,一个长度为n的字符串具有n(n+1)/2个子串。

例如:在上例的(6)中串F就是(5)中串E的子串,且子串F在主串E中的位置是5。

由于空格符也是一个字符,所以在串G=“abc defghne”中包含有子串“c def”,而串“cdef”不是串G的子串。

串G中第一个字符…e‟的位置是6,第二个字符…e‟的位置是11。

3.串的比较如果两个串的长度相等且对应位置上的字符相同,则称这两个串相等。

两个串A、B的比较过程是:从前往后逐个比较对应位置上的字符的ASCII码值,直到不相等或有一个字符串结束为止,此时的情况有以下几种:(1)两个串同时结束,表示A等于B;(2)A中字符的ASCII码值大于B中相应位置上字符的ASCII码值或B串结束,表示A大于B;(3)B中字符的ASCII码值大于A中相应位置上字符的ASCII码值或A串结束,表示A小于B。

例如:“abc”=“abc”,“abc”<“abcd”,“abxy”>“abcdefg”,“132”>“123456”“ABab”<“abAB”,“3+2”>“2+3”。

4.空格串由一个或多个空格字符组成的串称为空格串,空格串的长度为串中所含空格字符的个数。

在串操作中不要将空格串和空串混淆。

4.1.2串的基本操作尽管串的定义和线性表极为相似,但是串的基本操作和线性表有很大差别。

在线性表的基本操作中,大多以单个元素作为操作对象,比如对线性表的查找、访问、插入、删除和排序等;而在串的基本操作中,通常以串整体或串的一部分(子串)作为操作对象,比如子串的查找、截取子串、删除一个子串、插入子串和子串替换等操作。

串的基本操作主要有:(1)StrAssign(&T,chars)—由字符串常量chars生成字符串T的操作。

(2)StrCopy(&T,S)—由串S复制生成串T的操作。

(3)StrCompare(S,T)—若S=T返回0,S>T返回正数,S<T返回负数。

(4)StrLength(S)—返回串S的长度。

(5)Concat(&T,S1,S2)—将串S1和S2连接起来生成串T的操作。

(6)SubString(&Sub,S,pos,len)—以串S中pos位置开始的len个字符生成子串Sub的操作。

(7)Index(S,T,pos)—返回子串T在S中pos个字符以后出现的位置。

(8)Replace(&S,T,V)—将串S中所有不重叠子串T替换为串V的操作。

(9)StrInsert(&S,pos,T)—在串S中第pos个字符前插入串T的操作。

(10)StrDelete(&S,pos,len)—删除串S中第pos个字符开始的len个字符的操作。

4.2串的存储表示与实现既然串是线性表的特例,所以线性表的两种存储结构对于串也是适用的。

在应用中具体选用何种存储结构与串的操作有关,比如对串进行插入和删除操作运算时选用链存储结构较好,对串进行查找和求子串运算时选用顺序存储结构较好。

本章主要介绍串的3种存储表示方法:(1)串的定长顺序存储表示法(2)串的堆分配存储表示法(3)串的块链式存储表示法4.2.1串的定长顺序存储表示串的定长顺序存储表示是用一组地址连续的存储单元来存储串中的字符序列。

在串的定长顺序存储表示中,按照预定义的大小,为每个定长的串变量分配一个固定长度的存储区,所以可以用定长字符数组来表示。

1.定长顺序存储结构在C++运行环境中,定长顺序结构定义为:#include"iostream.h"#include"stdio.h"#define MAXLEN 255 //定义串的最大长度为255typedef char SString[MAXLEN+1]; //定义定长顺序存储类型SString2.基本操作的C++程序实现(1)求串长度操作int Length_SS(SString S)操作返回串S中所含字符的个数,即串的长度;如果S为空串则返回0。

int Length_SS(SString S){int i=0;while(S[i])i++;return i;}(2)串连接操作int Concat_SS(SString &T,SString S1,SString S2)该操作将串S1、S2连接生成串T,如果在连接过程中产生了截断(即S1的长度加上S2的长度大于MAXLEN)则返回0,否则返回1。

int Concat_SS(SString &T,SString S1,SString S2){int i,j,k;i=j=k=0;while(T[i++]=S1[j++]);i--;while(i<MAXLEN&&(T[i]=S2[k])){ i++;k++; }T[i]=0;if((i==MAXLEN)&&S2[k]) /*判断是否产生截断*/return(0);elsereturn(1);}(3)求子串操作int SubString_SS(SString &Sub,SString S,int pos,int len)该操作截取串S中从第pos个字符开始的连续的len个字符生成子串Sub,如果位置pos和长度len合理则返回1,否则返回0.int SubString_SS(SString &Sub,SString S,int pos,int len){int i=0;if(pos<1||len<0||pos+len>Length_SS(S)+1) /*判断位置和长度是否合理*/ return 0;while(i<len){Sub[i]=S[i+pos-1]; i++; }Sub[i]='\0';return 1;}(4)初始化串操作int StrAssign_SS(SString &T,char *s)该操作用字符数组s,初始化定长顺序串T。

如果不产生截断(长度合理)返回1,否则返回0。

int StrAssign_SS(SString &T,char *s){int i=0;while(i<MAXLEN&&(T[i]=s[i]))i++;T[i]=0;if((i==MAXLEN)&&s[i]) /*判断是否产生截断*/return 0;else return 1;}(5)串复制操作void StrCopy_SS(SString &T,SString S)该操作将定长顺序串S,复制到定长顺序串T。

void StrCopy_SS(SString &T,SString S){int i=0;while(T[i]=s[i])i++;}(6)串比较操作int StrCompare_SS(SString S,SString T)该操作比较顺序串S、T的大小,如果S>T则返回正数,如果S=T则返回0,否则返回负数。

int StrCompare_SS(SString S,SString T){int i=0;while(S[i]&&T[i]&&(S[i]==T[i]))i++;return (int)(S[i]-T[i]);}(7)串的替换操作int Replace_SS(SString &S,int n,int m,SString T)该操作将串S中从第n个字符开始的连续的m个字符替换成串T中的字符,如果n和m的选取合理则返回1,否则返回0。

int Replace_SS(SString &S,int n,int m,SString T){SString S1;int len=Length_SS(T);int i=n-1,j=0,k=n+m-1; /*i为开始替换位置,j指向第一个替换字符,k为剩余字符的开始位置*/if(n<1||m<0||n+m>Length_SS(S)+1||Length_SS(S)+len-m>MAXLEN) /*判断位置是否合理*/ return(0);StrCopy_SS(S1,S); /*将剩余部分复制到S1中*/while(S[i++]=T[j++]); /*替换S中指定部分的字符*/i--;while(S[i++]=S1[k++]); /*将剩余部分复制到S中*/return(1);}(8)主函数演示程序main()void main_SS(){SString s1,s2,s3,sub,T;char str1[100],str2[100];int l1,l2,l3,pos,len,n;while(1){cout<<"(1)串初始化操作:\n输入两个字符串:\n";cin.getline(str1,sizeof(str1));//表示从键盘输入一个可以含有空格字符的长度小于100的字符串到str1中,//语句“cin>>str1”不能输入空格字符(空格符表示输入结束)且对串的长度不做检查。

相关主题