数据结构习题—— 串、数组和广义表

4  串、数组和广义表

下标从1开始

一、填空题

1.        零个字符的串                 称为空串;       由一个或多个空格组成的串                        称为空白串。

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

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

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

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

   1282     ;若按行存储时,元素A14的第一个字节地址为    1072        ;若按列存储时,元素A47的第一个字节地址为    1276         

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

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

(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

(  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均不对

B   ) 5. 设矩阵A是一个对称矩阵,为了节省存储,将其下三角部分(按行序存放在一维数组B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素ai,j(i>j), 在一维数组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 176  。若按行存储,则A[3,5]和A[5,3]的第一个字节的地址分别是  B 76    C 108  。若按列存储,则A[7,1]和A[2,4]的第一个字节的地址分别是 28 D     E 116 

供选择的答案

A~E:①28   ② 44   ③ 76   ④ 92    ⑤ 108   ⑥ 116   ⑦ 132   ⑧ 176    ⑨ 184   ⑩ 188

答案:A=  8        B=  3          C=    5         D=    1             E=   6  

 

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

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

供选择的答案

A~D:①12  ②66  ③72  ④96  ⑤114  ⑥120  ⑦156  ⑧234  ⑨276   ⑩282   (11)283  (12)288

答案:A=   12       B=  10          C=  3           D=    9             E=            

 

三、计算题

  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)))

 

Concat (SubString (s,6,2), Concat (t, SubString (s,7,8)))=’A GOOD STUDENT’

 

 

四、算法设计题

  1. 编写一个实现串的置换操作Replace (&S, T, V)的算法。
  2. void Replace(StringType &S, StringType T, StringType V)
  3. /* 以串 v 置换串 s 中出现的所有和串 t 相同的非空串  */
  4. {  
  5.     int n,m,k,i;
  6.     StringType sub;
  7.     InitStr(sub);  
  8.     n = StrLength(S);
  9.     m = StrLength(T);
  10.     k = StrLength(V);
  11.     i = 1;
  12.     while(i <= n-m+1){
  13.         StrAssign(sub,SubString(S,i,m));//将串C中的子串逐个提取出来与串T进行匹配
  14.         if(StrCompare(sub,T) == 0){//匹配相等时
  15.             InitStr(sub);
  16.             Concat(sub,SubString(S,1,i-1));//将匹配相等的子串的前面的子串连接到串sub
  17.             Concat(sub,V);//将替换串连接到串sub
  18.             Concat(sub,SubString(S,m+i,n-(m+i)+1));//将匹配相等的子串的后面的子串连接到串sub
  19.             StrAssign(S,sub);
  20.             i += k;
  21.             n = StrLength(S);//操作完一次之后,串S已经改变,需要注意
  22.         }
  23.         else{
  24.             ++i;
  25.         }
  26.     }   
  27. }

 

 

 

 

  1. 写出将字符串反序的递推或递归算法,例如字符串为“abcsxw”,反序为“wxscba”

 

  1. void Reverse(string s)
  2. {
  3.     int size=S.length();
  4.     char temp;
  5.     for(int i=1;i<=size/2;i++)
  6.     {
  7.         temp=s[i];
  8.         s[i]=s[size-i+1];
  9.         s[size-i+1]=temp;
  10.     }
  11. }

 

递推算法:

  1. void StringReverse(StringType s,StringType &r)
  2. {
  3.     StrAssign(r,'');
  4.     char c;
  5.     for(int i=Strlen(s);i;i++)
  6.     {
  7.         StrAssign(c,SubString(s,i,1));
  8.         StrAssign(r,Concat(r,c));
  9.     }
  10. }

 

 

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值