数据结构习题4,5---串,数组和广义表

一、填空题

1.   不包含任何字符(长度为0)的串  称为空串;    由一个或多个空格(仅由空格符)组成的串    称为空白串。

2. 设S=“A;/document/Mary.doc”,则strlen(s)=    20      , “/”的字符定位的位置为     3    

3. 子串的定位运算称为串的模式匹配; 被匹配的主串    称为目标串,  子串   称为模式。

4. 若n为主串长,m为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为  (n-m+1)*m  

5. 假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为    288 B   ;末尾元素A57的第一个字节地址为   1282     ;若按行存储时,元素A14的第一个字节地址为  (8+4)×6+1000=1072    ;若按列存储时,元素A47的第一个字节地址为  (6×7+4)×6+1000)=1276     

(注:数组是从0行0列还是从1行1列计算起呢?由末单元为A57可知,是从0行0列开始!)

6. 设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为   8950

      

答:不考虑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

7. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的   行下标      列下标        元素值      

8..求下列广义表操作的结果:

(1) GetHead【((a,b),(c,d))】===   (a, b)      ;      //头元素不必加括号

(2) GetHead【GetTail【((a,b),(c,d))】】===  (c,d)     ;

(3) GetHead【GetTail【GetHead【((a,b),(c,d))】】】===   b   ;

(4) GetTail【GetHead【GetTail【((a,b),(c,d))】】】===   (d     ;

二、单选题

B  )1. 串是一种特殊的线性表,其特殊性体现在:

   A.可以顺序存储       B.数据元素是一个字符      

C.可以链式存储        D.数据元素可以是多个字符

B  )2. 设有两个串p和q,求q在p中首次出现的位置的运算称作:

   A.连接      B.模式匹配    C.求子串       D.求串长

D  )3. 设串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))的结果串是:

   A.BCDEF       B.BCDEFG     C.BCPQRST        D.BCDEFEF

解:con(x,y)返回xy串的连接串,即 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

A  )4. 假设有60行70列的二维数组a[1…60, 1…70]以列序为主序顺序存储,其基地址为10000,每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为      。(无第0行第0列元素)

   A.16902    B.16904      C.14454       D.答案A, B, C均不对

答:此题与填空题第8小题相似。(57列×60行+31行)×2字节+10000=16902

(  B   )5. 设矩阵A是一个对称矩阵,为了节省存储,将其下三角部分(如下图所示)按行序存放在一维数组B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素ai,j(ij), 在一维数组B中下标k的值是:

 

A.i(i-1)/2+j-1    B.i(i-1)/2+j      C.i(i+1)/2+j-1        D.i(i+1)/2+j

 

6. 从供选择的答案中,选出应填入下面叙述   ?  内的最确切的解答,把相应编号写在答卷的对应栏内。

有一个二维数组A,行下标的范围是0到8,列下标的范围是1到5,每个数组元素用相邻的4个字节存储。存储器按字节编址。假设存储数组元素A[0,1]的第一个字节的地址是0。

存储数组A的最后一个元素的第一个字节的地址是  A 。若按行存储,则A[3,5]和A[5,3]的第一个字节的地址分别是  B     C  。若按列存储,则A[7,1]和A[2,4]的第一个字节的地址分别是  D     E   

供选择的答案:

A~E:①28   ② 44   ③ 76   ④ 92    ⑤ 108

⑥ 116   ⑦ 132   ⑧ 176    ⑨ 184   ⑩ 188

答案:ABCDE=8,  3,  5,  1,  6

7. 有一个二维数组A,行下标的范围是1到6,列下标的范围是0到7,每个数组元素用相邻的6个字节存储,存储器按字节编址。那么,这个数组的体积是   A   个字节。假设存储数组元素A[1,0]的第一个字节的地址是0,则存储数组A的最后一个元素的第一个字节的地址是   B   。若按行存储,则A[2,4]的第一个字节的地址是  C   。若按列存储,则A[5,7]的第一个字节的地址是  D   

供选择的答案

A~D:①12   ② 66   ③ 72   ④ 96    ⑤ 114   ⑥ 120

    ⑦ 156   ⑧ 234     ⑨ 276   ⑩ 282    (11)283   (12)288

答案:ABCD=12,  10,    3,  9

三、计算题

  1. 设s=’I AM A STUDENT’, t=’GOOD’, q=’WORKER’, 求Replace(s,’STUDENT’,q) 和

Concat(SubString(s,6,2), Concat(t,SubString(s,7,8)))。

解:① Replace(s,’STUDENT’,q)’I AM A WORKER’

② 因为  SubString(s,6,2)=‘A ’;SubString(s,7,8)=‘ STUDENT

Concat(t,SubString(s,7,8))’GOOD STUDENT’

所以Concat(SubString(s,6,2), Concat(t,SubString(s,7,8)))=‘A GOOD STUDENT

2. (P60 4-18)用三元组表表示下列稀疏矩阵:

         

解:参见填空题4. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的   行下标      列下标        元素值      

所以(1)可列表为:                     (2)可列表为:

 

3. (P60 4-19)下列各三元组表分别表示一个稀疏矩阵,试写出它们的稀疏矩阵。

         

 

解:(1)为6×4矩阵,非零元素有6个。   (2)为4×5矩阵,非零元素有5个

四、算法设计题

  1. 编写一个实现串的置换操作Replace(&S, T, V)的算法。

解:

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

分析:i+=Strlen(V);这一句是必需的,也是容易忽略的.如省掉这一句,则在某些情况下, 会引起不希望的后果,虽然在大多数情况下没有影响.请思考:设S='place', T='ace', V='face',则省掉i+=Strlen(V);运行时会出现什么结果?

2.写出将字符串反序的递归递推算法,例如字符串为“abcsxw”,反序为“wxscba”(注:这也是严题集4.10③ 编写对串求逆的递推算法)

请注意递归和递推的区别!递推是由递进;  递归是由嵌套。

算法思路:

  • 假定用单链表结构存储字符串;

if没有到尾部字符就不停调用自身函数,直至到达末尾,再从尾部返回并打印字符;

否则就打印当前字符并返回。

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③答案:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

用户1234567890

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值