数据结构练习第四章串.docx

上传人:b****5 文档编号:12193953 上传时间:2023-04-17 格式:DOCX 页数:19 大小:41.89KB
下载 相关 举报
数据结构练习第四章串.docx_第1页
第1页 / 共19页
数据结构练习第四章串.docx_第2页
第2页 / 共19页
数据结构练习第四章串.docx_第3页
第3页 / 共19页
数据结构练习第四章串.docx_第4页
第4页 / 共19页
数据结构练习第四章串.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

数据结构练习第四章串.docx

《数据结构练习第四章串.docx》由会员分享,可在线阅读,更多相关《数据结构练习第四章串.docx(19页珍藏版)》请在冰豆网上搜索。

数据结构练习第四章串.docx

数据结构练习第四章串

数据结构练习第四章串

一、选择题

1.函数substr(“DATASTRUCTURE”,5,9)的返回值为()。

A.“STRUCTURE”B.“DATA”

C.“ASTRUCTUR”D.“DATASTRUCTURE”

2.字符串的长度是指()。

A.串中不同字符的个数B.串中不同字母的个数

C.串中所含字符的个数D.串中不同数字的个数

3.两个字符串相等的充要条件是()。

A.两个字符串的长度相等B.两个字符串中对应位置上的字符相等

C.同时具备(A)和(B)两个条件D.以上答案都不对

4.关于串的叙述中,正确的是()

A.空串是只含有零个字符的串

B.空串是只含有空格字符的串

C.空串是含有零个字符或含有空格字符的串

D.串是含有一个或多个字符的有穷序列

5.下面关于串的的叙述中,哪一个是不正确的?

()

A.串是字符的有限序列B.空串是由空格构成的串

C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储

6.设有两个串S1和S2,求S2在S1中首次出现的位置的运算称作()

A.求子串B.判断是否相等C.模型匹配D.连接

7.若串S=’software’,其子串的数目是()。

A.8B.37C.36D.9

8.串的长度是指()

A.串中所含不同字母的个数B.串中所含字符的个数

C.串中所含不同字符的个数D.串中所含非空格字符的个数

9.串是一种特殊的线性表,其特殊性体现在()。

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

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

10.下面关于串的的叙述中,哪一个是不正确的(B)

A.串是字符的有限序列

B.空串是由空格构成的串

C.模式匹配是串的一种重要运算

D.串既可以采用顺序存储,也可以采用链式存储

11.若串=‘software’,其非平凡子串(非空且不同于串本身)的数目是(C)

A.8B.37C.35D.9

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

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

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

13.下面关于串的的叙述中,哪一个是不正确的?

(B)

A.串是字符的有限序列

B.空串是由空格构成的串

C.模式匹配是串的一种重要运算

D.串既可以采用顺序存储,也可以采用链式存储

二、填空题

1.两个串是相等的,当且仅当两个串的长度相等且___对应位置_____的字符都相同。

2.串是一种特殊的线性表,串常见的存储结构有顺序存储和_____链式存储_两种方式。

3.空格串是指_______,其长度等于_______。

(1)由空格字符(ASCII值32)所组成的字符串

(2)空格个数

4.一个字符串中________称为该串的子串。

任意个连续的字符组成的子序列

5.字符串’ababaaab’的nextval函数值为________。

01010421

6.串是一种特殊的线性表,其特殊性表现在__

(1)__;串的两种最基本的存储方式是__

(2)__、__(3)__;两个串相等的充分必要条件是__(4)__。

(1)其数据元素都是字符

(2)顺序存储

(3)和链式存储

(4)串的长度相等且两串中对应位置的字符也相等

7.下列程序读入无符号16进制数(出现的字母为小写),将其转换为十进制数输出。

请将程序空缺部分补全。

intf(char*s)

{intn=0,i;

for(i=0;s[i]!

=’\0’;i++)n=n*16+

(1);

returnn;

main()

{chars[10];

scanf(“%s”,s);printf(“%d\n”,

(2));

(1)(s[i]>=97?

s[i]-87:

s[i]-48)∥‘a’到’f’的ASCII码是97到102

(2)f(s)

8.下列算法实现求采用顺序结构存储的串s和串t的一个最长公共子串。

voidmaxcomstr(orderstring*s,*t,intindex,length)

{inti,j,k,length1,con;

index=0;length=0;i=1;

while(i<=s.len)

{j=1;

while(j<=t.len)

{if(s[i]==t[j])

{k=1;length1=1;con=1;

while(con)

if

(1)_{length1=length1+1;k=k+1;}else

(2)__;

if(length1>length){index=i;length=length1;}

(3)____;

}

else(4)___;

}

(5)__

}}

[题目分析]本题算法采用顺序存储结构求串s和串t的最大公共子串。

串s用i指针(1<=i<=s.len)。

t串用j指针(1<=j<=t.len)。

算法思想是对每个i(1<=i<=s.len,即程序中第一个while循环),来求从i开始的连续字符串与从j(1<=j<=t.len,即程序中第二个while循环)开始的连续字符串的最大匹配。

程序中第三个(即最内层)的while循环,是当s中某字符(s[i])与t中某字符(t[j])相等时,求出局部公共子串。

若该子串长度大于已求出的最长公共子串(初始为0),则最长公共子串的长度要修改。

(1)i+k<=s.len&&j+k<=t.len&&s[i+k]==t[j+k]

∥如果在s和t的长度内,对应字符相等,则指针k后移(加1)

(2)con=0∥s和t对应字符不等时置标记退出

(3)j=j+k∥在t串中,从第j+k字符再与s[i]比较

(4)j=j+1∥t串取下一字符

(5)i=i+1∥s串指针i后移(加1)。

9.试利用下列栈和串的基本操作完成下述填空题。

initstack(s)置s为空栈;

push(s,x)元素x入栈;

pop(s)出栈操作;

gettop(s)返回栈顶元素;

sempty(s)判栈空函数;

setnull(st)置串st为空串;

length(st)返回串st的长度;

equal(s1,s2)判串s1和s2是否相等的函数;

concat(s1,s2)返回联接s1和s2之后的串;

sub(s,i,1)返回s中第i个字符;

empty(st)判串空函数

FUNCinvert(pre:

string;VARexp:

string):

boolean;

{若给定的表达式的前缀式pre正确,本过程求得和它相应的表达式exp并返回“true”,否则exp为空串,并返回“false”。

已知原表达式中不包含括弧,opset为运算符的集合。

}

VARs:

stack;i,n:

integer;succ:

boolean;ch:

char;

BEGIN

i:

=1;n:

=length(pre);succ:

=true;

(1)__;

(2)__;

WHILE(i

BEGINch:

=sub(pre,i,l);

IF(3)_THEN(4)__

ELSEIF(5)__THEN(6)_

ELSEBEGIN

exp:

=concat((7)___,(8)____);

exp:

=concat((9)___,(10)___);

(11)__;

END;

i:

=i+1

END;

IF(12)___THEN

BEGINexp:

=concat(exp,sub(pre,n,1));invert:

=trueEND

ELSEBEGINsetnull(exp);invert:

=falseEND

END;

注意:

每个空格只填一个语句。

(1)initstack(s)∥栈s初始化为空栈

 

(2)setnull(exp)∥串exp初始化为空串

(3)chinopset∥判取出字符是否是操作符

(4)push(s,ch)∥如ch是运算符,则入运算符栈s

(5)sempty(s)∥判栈s是否为空

(6)succ:

=false∥若读出ch是操作数且栈为空,则按出错处理

(7)exp

(8)ch∥若ch是操作数且栈非空,则形成部分中缀表达式

(9)exp

(10)gettop(s)∥取栈顶操作符

(11)pop(s)∥操作符取出后,退栈

  (12)sempty(s) ∥将pre的最后一个字符(操作数)加入到中缀式exp的最后

三、判断题

1.()子串“ABC”在主串“AABCABCD”中的位置为2。

T

2.()KMP算法的特点是在模式匹配时指示主串的指针不会变小。

3.()设模式串的长度为m,目标串的长度为n,当n≈m且处理只匹配一次的模式时,朴素的匹配(即子串定位函数)算法所花的时间代价可能会更为节省。

4.()串是一种数据对象和操作都特殊的线性表。

5.()串长度是指串中不同字符的个数。

×

6.()如果两个串含有相同的字符,则这两个串相等。

X

7.()KMP算法的最大特点是指示主串的指针不回溯。

四、简答题

1.KMP算法(字符串匹配算法)较Brute(朴素的字符串匹配)算法有哪些改进?

朴素的模式匹配(Brute-Force)时间复杂度是O(m*n),KMP算法有一定改进,时间复杂度达到O(m+n)。

主要优点是主串指针不回溯。

当主串很大不能一次读入内存且经常发生部分匹配时,KMP算法的优点更为突出。

2.给出字符串‘abacabaaad’在KMP算法中的next和nextval数组。

模式串的next函数定义如下:

根据此定义,可求解模式串’abacabaaad’的next和nextval值如下:

j

12345678910

t串

abacabaaad

next[j]

0112123422

nextval[j]

0102010422

 

3.模式匹配算法是在主串中快速寻找模式的一种有效的方法,如果设主串的长度为m,模式的长度为n,则在主串中寻找模式的KMP算法的时间复杂性是多少?

如果,某一模式P=’abcaacabaca’,请给出它的NEXT函数值及NEXT函数的修正值NEXTVAL之值。

KMP算法的时间复杂性是O(m+n)。

p的next和nextval值分别为01112212321和01102201320。

4.设目标为S=‘abcaabbcaaabababaabca’,模式为P=‘babab’。

(1)手工计算模式P的nextval数组的值;

(2)写出利用求得的nextval数组,按KMP算法对目标S进行模式匹配的过程。

(1)p的nextval函数值为01010。

(next函数值为01123)

(2)利用所得nextval数值,手工模拟对s的匹配过程。

5.s是字符数组,s[0]中存放的是该字符串的有效长度,假设s[1..7]中字符串的内容为“abcabaa”,说明下列程序的功能及执行结果。

#definelen8

intk,n[len];

chars[len]=“7abcabaa”;

voidunknown3(charT[])

{inti,j;

i=1;n[1]=0;j=0;

while(i

{if(j==0||T[i]==T[j])

{++i;++j;

if(T[i]!

=T[j])n[i]=j;elsen[i]=n[j];

}

elsej=n[j];

}

}

main()

{unknown3(s);for(k=1;k

本程序的功能是求字符串的nextval函数,程序执行结果是0110132。

6.给出KMP算法中失败函数f的定义,并说明利用f进行串模式匹配的规则,该算法的技术特点是什么?

这里失败函数f,即是通常讲的模式串的next函数,其定义见本章应用题的第5题。

进行模式匹配时,若主串第i个字符与模式串第j个字符发生失配,主串指针i不回溯,和主串第i个字符进行比较的是模式串的第next[j]个字符。

模式串的next函数值,只依赖于模式串,和主串无关,可以预先求出。

该算法的技术特点是主串指针i不回溯。

在经常发生“部分匹配”和主串很大不能一次调入内存时,优点特别突出。

7.已知:

s='(xyz)+*',t='(x+z)*y'。

试利用联结、求子串和置换等基本运算,将s转化为t。

【北方交通大学1996一.3(5分)】

题中所给操作的含义如下:

∥:

连接函数,将两个串连接成一个串

substr(s,i,j):

取子串函数,从串s的第i个字符开始,取连续j个字符形成子串

replace(s1,i,j,s2):

置换函数,用s2串替换s1串中从第i个字符开始的连续j个字符

本题有多种解法,下面是其中的一种:

(1)s1=substr(s,3,1)∥取出字符:

‘y’

(2)s2=substr(s,6,1)∥取出字符:

‘+’

(3)s3=substr(s,1,5)∥取出子串:

‘(xyz)’

(4)s4=substr(s,7,1)∥取出字符:

‘*’

(5)s5=replace(s3,3,1,s2)∥形成部分串:

‘(x+z)’

(6)s=s5∥s4∥s1∥形成串t即‘(x+z)*y’

8.已知模式串pat=’ADABBADADA’,写出该模式串的next函数值和nextval值;(4分)

五、应用题

模式串t=’abaabc’,求t的next函数值。

j

123456

模式串

abaabc

next[j]

 

【解答】

j

123456

模式串

abaabc

next[j]

011223

评分标准:

全题4分,错误酌情扣分

六、算法设计题

1.设计在顺序存储结构上实现求子串算法。

voidsubstring(chars[],longstart,longcount,chart[])

{

longi,j,length=strlen(s);

if(start<1||start>length)printf("Thecopypositioniswrong");

elseif(start+count-1>length)printf("Toocharacterstobecopied");

else{for(i=start-1,j=0;i

}

2.设s、t为两个字符串,分别放在两个一维数组中,m、n分别为其长度,判断t是否为s的子串。

如果是,输出子串所在位置(第一个字符),否则输出0。

(注:

用程序实现)

【中科院研究生院2003九(15分)】【南京航空航天大学1997九(10分)】

[题目分析]判断字符串t是否是字符串s的子串,称为串的模式匹配,其基本思想是对串s和t各设一个指针i和j,i的值域是0..m-n,j的值域是0..n-1。

初始值i和j均为0。

模式匹配从s0和t0开始,若s0=t0,则i和j指针增加1,若在某个位置si!

=tj,则主串指针i回溯到i=i-j+1,j仍从0开始,进行下一轮的比较,直到匹配成功(j>n-1),返回子串在主串的位置(i-j)。

否则,当i>m-n则为匹配失败。

intindex(chars[],t[],intm,n)

∥字符串s和t用一维数组存储,其长度分别为m和n

∥本算法求字符串t在字符串s中的第一次出现,匹配成功输出t串在s中的位置,否则输出0

{inti=0,j=0;

while(i<=m-n&&j<=n-1)

if(s[i]==t[j]){i++;j++;}∥对应字符相等,指针后移

else{i=i-j+1;j=0;}∥对应字符不相等,i回溯,j仍为0

if(i<=m-n&&j==n){printf(“t在s串中位置是%d”,i-n+1);return(i-n+1);}∥匹配成功

elsereturn(0);∥匹配失败

}∥算法index结束

main()∥主函数

{chars[],t[];intm,n,i;

scanf(“%d%d”,&m,&n);∥输入两字符串的长度

scanf(“%s”,s);∥输入主串

scanf(“%s”,t);∥输入子串

i=index(s,t,m,n);

}∥程序结束

[程序讨论]因用C语言实现,一维数组的下标从0开始,m-1是主串最后一个字符的下标,n-1是t串的最后一个字符的下标。

若匹配成功,最佳情况是s串下标0到n-1的字符与t匹配,时间复杂度为O(n);匹配成功的最差情况是,每次均在t的最后一个字符才失败,直到s串的下标为m-n时成功,其时间复杂度为O((m-n)*n),即O(m*n)。

失败的情况是s串的第m-n个字符比t串某字符比较失败,时间复杂度为O(m*n)。

之所以串s的指针i最大到m-n,是因为在m-n之后,所剩串的长度已经小于子串长度n,故不必再去比较。

算法中未讨论输入错误(如s串长度小于t串长度)。

另外,根据子串的定义,返回值i-n+1是子串在主串中的位置,子串在主串中的下标是i-n。

3.以顺序存储结构表示串,设计算法。

求串S中出现的第一个最长重复子串及其位置并分析算法的时间复杂度。

【东南大学2000五(15分)】【西北大学2002六(15分)】

[题目分析]设以字符数组s表示串,重复子串的含义是由一个或多个连续相等的字符组成的子串,其长度用max表示,初始长度为0,将每个局部重复子串的长度与max相比,若比max大,则需要更新max,并用index记住其开始位置。

intLongestString(chars[])

∥串用一维数组s存储,本算法求最长重复子串,返回其长度

{intindex=0,max=0;∥index记最长的串在s串中的开始位置,max记其长度

intlength=1,i=0,start=0;∥length记局部重复子串长度,i为字符数组下标

while(s[i]!

=’\0’)

if(s[i]==s[i+1]){i++;length++;}

else∥上一个重复子串结束

{if(max

i++;start=i;length=1;∥初始化下一重复子串的起始位置和长度

}

printf(“最长重复子串的长度为%d,在串中的位置%d\n”,max,index);

return(max);

}∥算法结束

算法的时间复杂度为O(n),每个字符与其后继比较一次。

4.编写程序,统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这10个数字)。

【西北大学2000四(10分)】

[问题分析]由于字母共26个,加上数字符号10个共36个,所以设一长36的整型数组,前10个分量存放数字字符出现的次数,余下存放字母出现的次数。

从字符串中读出数字字符时,字符的ASCII代码值减去数字字符‘0’的ASCII代码值,得出其数值(0..9),字母的ASCII代码值减去字符‘A’的ASCII代码值加上10,存入其数组的对应下标分量中。

遇其它符号不作处理,直至输入字符串结束。

voidCount()

∥统计输入字符串中数字字符和字母字符的个数

{inti,num[36];

charch;

 for(i=0;i<36;i++)num[i]=0;∥初始化

 while((ch=getchar())!

=‘#’)∥‘#’表示输入字符串结束

   if(ch>=‘0’&&ch<=‘9’){i=ch-48;num[i]++;}∥数字字符

  else if(ch>=‘A’&&ch<=‘Z’){i=ch-65+10;num[i]++;}∥字母字符   

 for(i=0;i<10;i++)∥输出数字字符的个数

    printf(“数字%d的个数=%d\n”,i,num[i]);

 for(i=10;i<36;i++)∥求出字母字符的个数

    printf(“字母字符%c的个数=%d\n”,i+55,num[i]);

}∥算法结束。

5.写出一个递归算法来实现字符串逆序存储。

【中科院研究生院2004四(7分)】

[题目分析]实现字符串的逆置并不难,但本题“要求不另设串存储空间”来实现字符串逆序存储,即第一个输入的字符最后存储,最后输入的字符先存储,使用递归可容易做到。

voidInvertStore(charA[])

∥字符串逆序存储的递归算法

{charch;

staticinti=0;∥需要使用静态变量

scanf("%c",&ch);

if(ch!

='.')∥规定'.'是字符串输入结束标志

{InvertStore(A);

A[i++]=ch;∥字符串逆序存储

}

A[i]='\0';∥字符串结尾标记

}∥结束算法InvertStore

6.S=“S1S2…Sn”是一个长为N的字符串,存放在一个数组中,编程序将S改造之后输出:

(1)将S的所有第偶数个字符按照其原来的下标从大到小的次序放在S的后半部分;

(2)将S的所有第奇数个字符按照其原来的下标从小到大的次序放在S的前半部分;

例如:

S=‘ABCDEFGHIJKL’

则改造后的S为‘ACEGIKLJHFDB’。

【中科院计算所1995】

[题目分析]对读入的字符串的第奇数个字符,直接放在数组前面,对第偶数个字符,先入栈,到读字符串结束,再将栈中字符出栈,送入数组中。

限于篇幅,这里编写算法,未编程序。

voidReArrangeString()

∥对字符串改造,将第偶数个字符放在串的后半部分,第奇数个字符前半部分。

{charch,s[],stk[];∥s和stk是字符数组(表示字符串)和字符栈

inti=1,j;∥i和j字符串和字符栈指针

while((ch=getchar())!

=’#’)s[i++]=ch;∥读入字符串,’#’是字符串结束标志

s[i]=’\0’;∥字符数组中字符串结束标志

i=1;j=1;

while(s[i])∥改造字符串

{if(i%2==0)stk[i/2]=s[i];elses[j++]=s[i];

i++;

}∥while

i--;i=i/2;∥i先从’\0’后退,然后其含义是第偶数字符的个数

while(i>0)s[j++]=stk[i--]∥将第偶数个字符逆序填入原字符数组

}

7.若x和y是两个采用顺序结构

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 家庭教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1