数据结构练习第四章 串.docx
- 文档编号:3379186
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:15
- 大小:40.29KB
数据结构练习第四章 串.docx
《数据结构练习第四章 串.docx》由会员分享,可在线阅读,更多相关《数据结构练习第四章 串.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构练习第四章串
数据结构练习第四章串
一、选择题
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是两个采用顺序结构存储的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构练习第四章 数据结构 练习 第四