第4章串复习题解答Word格式.docx
《第4章串复习题解答Word格式.docx》由会员分享,可在线阅读,更多相关《第4章串复习题解答Word格式.docx(32页珍藏版)》请在冰豆网上搜索。
(3)C=“BeiJing”(长度为8的串)
(4)D=“”(长度为0的空串)
(5)E=“Thisisastring”(长度为16的串)
(6)F=“isa”(长度为6的串)
2.子串、主串和位置
串中任意连续的字符组成的子序列称为该串的子串;
相应地,包含子串的串称为主串。
串中的字符在串序列中的序号称为该字符在该串中的位置;
子串的第一个字符在主串中的位置称为子串在主串中的位置。
显然,串为其自身的子串,并规定空串为任何串的子串。
显然,在不考虑空子串的情况下,一个长度为n的字符串具有n(n+1)/2个子串。
在上例的(6)中串F就是(5)中串E的子串,且子串F在主串E中的位置是5。
由于空格符也是一个字符,所以在串G=“abcdefghne”中包含有子串“cdef”,而串“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"
stdio.h"
#defineMAXLEN255//定义串的最大长度为255
typedefcharSString[MAXLEN+1];
//定义定长顺序存储类型SString
2.基本操作的C++程序实现
(1)求串长度操作intLength_SS(SStringS)
操作返回串S中所含字符的个数,即串的长度;
如果S为空串则返回0。
intLength_SS(SStringS)
{inti=0;
while(S[i])i++;
return(i);
}
(2)串连接操作intConcat_SS(SString&
T,SStringS1,SStringS2)
该操作将串S1、S2连接生成串T,如果在连接过程中产生了截断(即S1的长度加上S2的长度大于MAXLEN)则返回0,否则返回1。
intConcat_SS(SString&
{
inti,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)求子串操作intSubString_SS(SString&
Sub,SStringS,intpos,intlen)
该操作截取串S中从第pos个字符开始的连续的len个字符生成子串Sub,如果位置pos和长度len合理则返回1,否则返回0.
intSubString_SS(SString&
inti=0;
if(pos<
1||len<
0||pos+len>
Length_SS(S)+1)return0;
/*判断位置和长度是否合理*/
len){Sub[i]=S[i+pos-1];
i++;
Sub[i]='
\0'
;
return1;
(4)初始化串操作intStrAssign_SS(SString&
T,char*s)
该操作用字符数组s,初始化定长顺序串T。
如果不产生截断(长度合理)返回1,否则返回0。
intStrAssign_SS(SString&
(T[i]=s[i]))i++;
s[i])return0;
elsereturn1;
(5)串复制操作voidStrCopy_SS(SString&
T,SStringS)
该操作将定长顺序串S,复制到定长顺序串T。
voidStrCopy_SS(SString&
while(T[i]=s[i])i++;
(6)串比较操作intStrCompare_SS(SStringS,SStringT)
该操作比较顺序串S、T的大小,如果S>
T则返回正数,如果S=T则返回0,否则返回负数。
intStrCompare_SS(SStringS,SStringT)
while(S[i]&
T[i]&
(S[i]==T[i]))i++;
return(int)(S[i]-T[i]);
(7)串的替换操作intReplace_SS(SString&
S,intn,intm,SStringT)
该操作将串S中从第n个字符开始的连续的m个字符替换成串T中的字符,如果n和m的选取合理则返回1,否则返回0。
intReplace_SS(SString&
SStringS1;
intlen=Length_SS(T);
inti=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()
voidmain_SS()
SStrings1,s2,s3,sub,T;
charstr1[100],str2[100];
intl1,l2,l3,pos,len,n;
while
(1)
{
cout<
<
"
(1)串初始化操作:
\n输入两个字符串:
\n"
cin.getline(str1,sizeof(str1));
/*表示从键盘输入一个可以含有空格字符的长度小于100的字符串到str1中,语句“cin>
>
str1”不能输入空格字符(空格符表示输入结束)且对串的长度不做检查。
*/
cin.getline(str2,sizeof(str2));
StrAssign_SS(s1,str1);
StrAssign_SS(s2,str2);
l1=Length_SS(s1);
l2=Length_SS(s2);
(2)求串长操作:
\ns1的长度="
l1<
,s2的长度="
l2<
endl;
n=StrCompare_SS(s1,s2);
(3)串比较操作:
\n比较结果为:
"
if(n>
0)cout<