第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=
三、计算题
- 设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’
四、算法设计题
- 编写一个实现串的置换操作Replace (&S, T, V)的算法。
- void Replace(StringType &S, StringType T, StringType V)
- /* 以串 v 置换串 s 中出现的所有和串 t 相同的非空串 */
- {
- int n,m,k,i;
- StringType sub;
- InitStr(sub);
- n = StrLength(S);
- m = StrLength(T);
- k = StrLength(V);
- i = 1;
- while(i <= n-m+1){
- StrAssign(sub,SubString(S,i,m));//将串C中的子串逐个提取出来与串T进行匹配
- if(StrCompare(sub,T) == 0){//匹配相等时
- InitStr(sub);
- Concat(sub,SubString(S,1,i-1));//将匹配相等的子串的前面的子串连接到串sub后
- Concat(sub,V);//将替换串连接到串sub后
- Concat(sub,SubString(S,m+i,n-(m+i)+1));//将匹配相等的子串的后面的子串连接到串sub后
- StrAssign(S,sub);
- i += k;
- n = StrLength(S);//操作完一次之后,串S已经改变,需要注意
- }
- else{
- ++i;
- }
- }
- }
- 写出将字符串反序的递推或递归算法,例如字符串为“abcsxw”,反序为“wxscba”
- void Reverse(string s)
- {
- int size=S.length();
- char temp;
- for(int i=1;i<=size/2;i++)
- {
- temp=s[i];
- s[i]=s[size-i+1];
- s[size-i+1]=temp;
- }
- }
递推算法:
- void StringReverse(StringType s,StringType &r)
- {
- StrAssign(r,'');
- char c;
- for(int i=Strlen(s);i;i++)
- {
- StrAssign(c,SubString(s,i,1));
- StrAssign(r,Concat(r,c));
- }
- }