不包含任何字符(长度为0)的串称为 空串 ;由一个或多个空格(仅由空格符)组成的串称为 空白串。
设S=“A;/document/Mary.doc”,则strlen(s)= 20 , “/”的字符定位的位置为 3 。
子串的定位运算称为串的模式匹配; 被匹配的主串称为 目标串 ,子串 称为模式 。
若n为主串长,m为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为 (n-m+1)*m 。
假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为 288 B ;末尾元素A57的第一个字节地址为 1282 1000+[8*5+7]6 ;若按行存储时,元素A14的第一个字节地址为 [8(1-0)+(4-0)]×6+1000=1072 ;若按列存储时,元素A47的第一个字节地址为 [6×(7-0)+(4-0)]×6+1000)=1276 。
(注:数组是从0行0列还是从1行1列计算起呢?由末单元为A57可知,是从0行0列开始!)
- 不考虑0行0列,利用列优先公式: LOC(aij)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L
- 得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=8950
8…求下列广义表操作的结果:
(1)GetHead【((a,b),(c,d))】== (a, b) ; //头元素不必加括号
(2)GetHead【GetTail【((a,b),(c,d))】】== (c,d) ;
GetTail【((a,b),(c,d))】=((c,d))
GetHead【GetTail【((a,b),(c,d))】】=GetHead【((c,d))】=(c,d)
(3)GetHead【GetTail【GetHead【((a,b),(c,d))】】】== b ;
GetHead【((a,b),(c,d))】=(a,b)
GetTail【GetHead【((a,b),(c,d))】】=(b)
GetHead【GetTail【GetHead【((a,b),(c,d))】】】=b
(4)GetTail【GetHead【GetTail【((a,b),(c,d))】】】== (d) ;
GetTail【((a,b),(c,d))】=((c,d))
GetHead【GetTail【((a,b),(c,d))】】=(c,d)
GetTail【GetHead【GetTail【((a,b),(c,d))】】】=d
- 解析:s为串名,用双引号括起来的字符序列为串值(引号本身不属于串的内容),ai(1<=i<=n)是一个任意字符,也称为串的元素(即数据元素),是构成串的基本单位,i是它在整个串中的序号,n为串的长度,表示串中所包含的字符个数。
- 串的数据元素,也就是串的基本单位在这里是一个字符,而非多个字符。
- 多个字符的话,那就不叫数据元素,而叫做串的子串了,子串又是由多个数据元素组成的有限序列。
设有两个串p和q,求q在p中首次出现的位置的运算称作:( B )
A.连接 B.模式匹配 C.求子串 D.求串长
设串s1=’ABCDEFG’,s2=’PQRST’,函数con(x,y)返回x和y串的连接串,subs(s, i, j)返回串s的从序号i开始的j个字符组成的子串,len(s)返回串s的长度,则con(subs(s1, 2, len(s2)), subs(s1, len(s2), 2))的结果串是:( D )
A.BCDEF B.BCDEFG C.BCPQRST D.BCDEFEF
- con(x,y)返回x和y串的连接串,即 con(x,y)=‘ABCDEFGPQRST’;
- subs(s, i, j)返回串s的从序号i开始的j个字符组成的子串,则
- subs(s1, 2, len(s2))=subs(s1, 2, 5)=’ BCDEF’; subs(s1, len(s2), 2)=subs(s1, 5, 2)=’ EF’;
- con(subs(s1, 2, len(s2)), subs(s1, len(s2), 2))=con(’ BCDEF’, ’ EF’)之连接,即BCDEFEF
- 解析:注意数组下标从1开始。 下三角中的元素aij前面有i-1行,共有i*(i-1)/2个元素,aij是它所在行中的第j个,所以选择k=i(i-1)/2+j




int Replace(Stringtype &S,Stringtype T,Stringtype V);//将串S中所有子串T替换为V,并返回置换次数
{
for(n=0,i=1;i<=Strlen(S)-Strlen(T)+1;i++) //注意i的取值范围
if(!StrCompare(SubString(S,i,Strlen(T)),T)) //找到了与T匹配的子串
{ //分别把T的前面和后面部分保存为head和tail
StrAssign(head,SubString(S,1,i-1));
StrAssign(tail,SubString(S,i+Strlen(T),Strlen(S)-i-Strlen(T)+1));
StrAssign(S,Concat(head,V));
StrAssign(S,Concat(S,tail)); //把head,V,tail连接为新串
i+=Strlen(V); //当前指针跳到插入串以后
n++;
n++;
}//if
return n;
}//Replace
Invert(stringlistnode *p){
if(!p)return(0);
else Invert(p->next);
printf(“%c”, p->data)
}
//如果当前串长为0,则return(-1)否则开始递归:
if //串没有到末尾,则P=P->next; 再调用invert(s);
else printf(p->data);
return
```
严题集4.10③答案:
```cpp
void String_Reverse(Stringtype s,Stringtype &r)//求s的逆串r
{
StrAssign(r,''); //初始化r为空串
for(i=Strlen(s);i;i--)
{
StrAssign(c,SubString(s,i,1));
StrAssign(r,Concat(r,c)); //把s的字符从后往前添加到r中 这是递推算法。
}
}//String_Reverse
```