数据结构 习题课2Word格式文档下载.docx
《数据结构 习题课2Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构 习题课2Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
temp)){x=pop(&
temp);
S1,x);
S2,x);
}
【答案】程序段的功能是:
利用工作栈temp将栈S1复制到栈S2。
(3)voiddemo2(Seqstack*S,intm){
SeqstackT;
inti;
Initstack(&
T);
while(!
stackempty(S))
if(i=pop(S))!
=m)push(&
T,i);
T)){i=pop(&
push(S,i);
}//demo2
利用工作栈t将栈S中的值为m的元素滤掉。
(4)voiddemo3(CirQueue*Q){
intx;
SeqstackS;
S);
QueueEmpty(Q)){x=Delqueue(Q);
push(&
S,x);
S)){x=pop(&
Enqueue(Q,x);
}//demo3
【答案】见同步练习题。
CirQueueQ1,Q2;
intx,i,m=0;
……//假设Q1已有内容Q2已作过初始化
QueueEmpty(&
Q1)){x=Delqueue(&
Q1);
Enqueue(Q2,x);
m++;
for(i=0;
m:
i++){x=Delqueue(&
Q2);
Enqueue(Q1,x);
Enqueue(Q2,x);
把队列Q1的内容复制到队列Q2中。
算法设计题
6.回文是指正读和反读均相同的字符序列,例如“abba”和“abdba”均是回文,但“good”不是回文。
试写一个算法判定给定的字符向量是否为回文(提示:
将一半字符入栈)。
【答案】算法如下:
intrevers(chart[])
{Seqstack*S;
charch;
intk,n;
Initstack(S)
n=strlen(t);
for(k=0;
k<
n/2;
k++)
push(S,t[k]);
k=k+n%2;
stackempty(S))
{ch=pop(S);
if(ch==t[k])k++;
elsereturn0;
}
retuen1;
7.利用栈的基本操作,写一个将栈S中所有元素均出栈的算法voidClearstack(Seqstack*S),并说明S为何要作为指针参数?
voidClearstack(Seqstack*S)
{while(!
pop(S);
说明:
出栈操作为加工型操作,需要将操作后的结果带回主调程序段,所以S要作为指针参数。
8.利用栈的基本操作,写一个返回栈S中结点个数的算法intstacksize(SeqstackS),并说明S为何不用作为指针参数?
intstacksize(SeqstackS)
{
returnS.top+1;
统计结点个数操作为引用型操作,栈S的内容没有被修改,所以S不用作为指针参数。
由于C语言数组下标从0开始,故结点个数为S.top+1。
9.设计算法判断一个算术表达式的圆括号是否正确配对。
(提示:
凡遇‘(‘就进栈,遇‘)’就退掉栈顶的‘(‘,表达式扫描完毕,栈应为空)
intbracketsmatch(chara[])
{//设算术表达式以字符串形式存储在数组中
Seqstack*S;
Initstack(S);
intk=0;
while(a[k]!
=’\0’)
if(a[k]=='(')Push(S,'(');
elseif(a[k]==')')
if(Stackempty(S))return0;
elsePop(S);
if(Stackempty(S))return1;
elsereturn0;
10.一个双向栈S是在同一向量空间里实现的两个栈,它们的栈底分别设在向量空间的两端。
试为此双向栈设计初始化Initstack(S)、入栈push(S,x,i)和出栈pop(i)算法,其中,i为0或1用于指示栈号。
#definmaxsize100
typedefstructnode{
datatypedata[maxsize];
inttop1,top2;
}Seqstack;
(1)双向栈的初始化
viodInitstack(Seqstack*S)
S->
top1=-1;
S->
top2=maxsize;
(2)双向栈入栈算法
viodpush(Seqstack*S,datatypex,inti)
{if(S->
top1+1==S->
top2)
erroe(overflow);
else
if(i==0)
{S->
top1++;
data[S->
top1]=x;
top2--;
top2]=x;
}
(3)双向栈出栈算法
datatypepop(Seqstack*S,inti)
{if(i==0)
if(S->
top1==-1)
error(downflow);
{returnS->
top1]}
if(S->
top2==maxsize)
error(downflow);
else
returnS->
top2];
11.Ackerman函数的定义如下:
n+1当m=0时
AKM(m,n)=AKM(m-1,1)当m≠0,n=0时
AKM(m-1,AKM(m,n-1)) 当m≠0,n≠0时
请写出递归算法。
【答案】算法如下:
intakm(intn,intm)
{if(m==0)
returnn+1;
elseif(n==0&
&
m!
=0)
returnakm(m-1,1);
returnakm(m-1,akm(m,n-1));
12.用第二种方法,既少用一个元素空间的方法来区别循环队列的空和满,试为其设计置队空、判断队空、判断队满、出队、入队、取队头元素等六个基本操作的算法。
#definmaxsize100
intfront,rear;
}Seqqueue;
(1)置队空操作
voidInitqueue(Seqqueue*Q)
{Q->
front=0;
Q->
rear=0;
(2)判断队空操作
intQueueempty(SeqqueueQ)
{
returnO.front==Q.rear;
(3)判断队满操作
intQueuefull(SeqqueueQ)
returnO.front==(Q.rear+1)%maxsize;
(4)出队操作
datatypedelquequ(Seqqueue*Q)
{datatypetemp;
if(O->
rear)
error("downflow");
temp=Q->
data[Q->
front];
front=(Q->
front+1)%maxsize;
returntemp;
(5)入队操作
voidenqueue(Seqqueue*Q,datatypex)
{if(Q->
rear+1)%maxsize)
error("overflow");
rear]=x;
rear=(Q->
rear+1)%maxsize;
(6)取队头操作
datatypedelquequ(Seqqueue*Q)
returnQ->
13.假设以带头结点的循环链表表示队列,并且只是一个指针指向队尾元素结点,试编写相应的置队空、判断队空、出队和入队等算法。
datatypedata;
structnode*next;
}Linknode;
typedefstruct{
Linknode*rear;
}Linkqueue;
(1)置队空操作
voidInitqueue(Linkqueue*Q)
{Q->
rear=(linknode*)malloc(sizeof(Linknode))
rear->
next=Q->
reqr;
returnQ.rear->
next=Q.reqr;
(3)出队操作
datatypedelquequ(Linkqueue*Q)
Linknode*p;
next==Q->
p=Q->
next->
next;
temp=p->
data;
next=p->
if(p==Q->
rear)Q->
rear=Q->
free(p);
(4)入队操作
voidenqueue(Linkqueue*Q,datatypex)
{Linknode*p;
p=(Linknode*)malloc(sizeof(Linknode));
p->
data=x;
next=p;
rear=p;
14.对于循环向量中的循环队列,写出求队列长度的公式。
【答案】循环队列求队列长度的公式为:
(Q.rear-Q.front+maxsize)%maxsize
15.假设循环队列中只设rear和quelen来分别指示队尾元素的位置和队中元素的个数,试给出循环队列的队满条件,并写出相应的入队和出队算法,要求出队时需返回队头元素。
(1)队满条件:
Q.quelen==maxsize
(2)入队算法:
voidenqueue(cirqueue*Q,datatypex)
{if(O->
quelen==maxsize)
error("overflow");
reae+1)%maxsize;
(3)出队算法:
datatypedelqueue(cirqueue*Q)
{datatypex;
if(O->
quelen==0)
error("downflow");
x=Q->
data[(Q->
reae+maxsize-Q->
quelen+1)%maxsize];
quelen--;
returnx;
串
一、选择题
1.下所述中正确的是()〖2001〗
A.串是一种特殊的线性表B. 串的长度必须大于零
C.串中元素只能是字母 D.空串就是空白串
〖答案〗A
2.若目标串的长度为n,模式串的长度为[n/3],则执行模式匹配算法时,在最坏情况下的时间复杂度是( )〖2001〗
A.O(n/3) B.O(n) C.O(n2) D.O(n3)
〖分析〗最坏情况下模式匹配的时间复杂度为O((n-[n/3]+1)*[n/3]),由于n和[n/3]是同阶的,所以,时间复杂度可写为O(n2)。
〖答案〗C
3.设有两个串T和P,求P在T中首次出现的位置的串运算称作(
)〖2003〗
A.联接
B.求子串
C.字符定位
D.子串定位
〖分析〗该题考核点是串的基本操作。
〖答案〗D
4.为查找某一特定单词在文本中出现的位置,可应用的串运算是(
)〖2002〗
A.插入
B.删除
C.串联接
5.已知函数Sub(s,i,j)的功能是返回串s中从第i个字符起长度为j的子串,函数Scopy(s,t)的功能为复制串t到s。
若字符串S="
SCIENCESTUDY"
,则调用函数Scopy(P,Sub(S,1,7))后得到(
)〖2002〗
A.P="
SCIENCE"
B.P="
STUDY"
C.S="
D.S="
〖分析〗该题考核点是串的基本操作,函数Scopy(P,Sub(S,1,7))将串中子串″SCIENCE″复制到P中,而串S值未变。
正确答案为A。
二、填空题
6.在串S="
structure"
中,以t为首字符的子串有 个。
〖2001〗
〖分析〗该题考核点是子串的概念。
其中存在两个长度为1的子串。
〖答案〗12
7.串S="
Iamaworker"
的长度是________。
〖2002〗
〖分析〗该题考核点是串长度的概念。
〖答案〗13
8.设S1="
good"
S2="
"
S3="
book"
,则S1,S2和S3依次联接后的结果是____________。
〖2003〗
〖分析〗该题考核点是串的连接操作及空白串的概念。
〖答案〗"
good
book"
三、算法阅读题
9.下列算法的功能是比较两个链串的大小,其返回值为:
-1s1<
s2
comstr(s1,s2)=0s1=s2
1s1>
请在空白处填入适当的内容。
intcomstr(linkstrings1,linkstrings2)
{//s1和s2为两个链串的头指针
while(s1&
s2){
if(s1->
data<
s2->
data)return–1;
data>
data)return1;
①
②
if(③)return–1;
if(④)return1;
⑤;
〖分析〗该题考核点是串的比较操作。
While型循环通过指针s1、s2将两个串中字符逐一比较,若发现不等字符,则不等字符的大小就是两个串的大小;
若所比较字符均相等,直到有串被扫描完为止,退出循环。
然后判断,若某个串未被扫描完,则其值大,若两个串同时被扫描完,则两个串相等。
〖答案〗① s1=s1->
②s2=s2->
③s2(或s2!
=NULL)④s1(或s1!
=NULL)⑤return0
同步练习题
一、选择题
1.下列有关字符串的描述,正确的是()
A.字符串是0个或多个字符构成的有限序列;
B.字符串是0个或多个字母不同的有限序列;
C.字符串中最少要有一个子符;
D.字符串中不能有空格字符。
2.字符串S="string"中,包含的子串的个数是()
A.20B.21C.22D.23
3.目标串为T="thisisastring",模式串P="string",进行模式匹配,有效位移是()(起始位置为0)。
A.9B.10C.11D.12
4.已知串S="string",T="this",执行运算strlen(strcopy(S,T))的结果是()
A.4B.6C.10D.2
5.目标串为T="thisisastring",模式串P="string",进行模式匹配,所有的无效位移数是()
A.6B.10C.16D.11
6.下列命题正确的是()
A.空串就是空白串;
B.空串不是串;
C.空串是长度为0的字符串D.串相等指的是长度相等
7.若字符串采用链式存储,每个字符占用一个字节,每个指针在占用四个字节,则该字符串的存储密度为()
A.50%B.25%C.75%D.20%
8.当目标串的长度为n,模式串的长度为m时,朴素的模式匹配算法最坏情况下字符的比较次数()
A.nB.n*mC.(n-m+1)*mD.m
9.当目,模式串的长度为m时,朴素的模式匹配算法最好情况下字符的比较次数()
A.nB.mC.n+mDn-m
10.字符串是一种特殊的线性表,它与一般线性表的区别是()
A.字符串是一种线性结构;
B.字符串可以进行复制操作;
C.字符串由字符构成并且通常作为整体参与操作;
D.字符串可以顺序存储也可以链式存储。
1.空串的长度为,空格串(空白串)的长度为。
2.子串的定位运算又称为,通常把主串又称为子串又称为。
3.成功匹配的起始位置称为,匹配失败的起始位置称为。
4.设目标串为T="abccdadeef",模式串P="ade",则第趟匹配成功。
5.已知串T="abccdadeef",P="abccyde",函数strcmp(T,P)的运算结果是。
6.串朴素的模式匹配算法在顺序串和链串上运行,时间复杂度。
7.已知串T="abccdadeef",T中包含以b打头的子串有个。
8.通常在程序设计中,串分为和。
9.按存储结构通常分为和。
10.设s1="GOOD",s2=" ",s3="BYE!
",则s1,s2,和s3连接后的结果是。
三.阅读程序题
1.指出程序功能
intstringcmp(HstringS,HstringT)
{inti=0,tag=1;
if(S.length!
=T.length)tag=0;
while(i<
S.length&
tag)
if(S.ch[i]==T.ch[i])i++;
elsetag=0;
returntag;
2.阅读程序
intstringpatindex(HstringS,HstringT)
{inti,j,k;
for(i=0;
S.length;
i++)
{for(j=i,k=0;
T.length;
j++,k++)
if(S.ch[j]!
=T.ch[k]&
|T[k]!
='?
')
break;
if(k>
=T.length)returni;
return–1;
(1)指出程序功能;
(2)设S中存储"thereareastring",T中存储"?
?
r"函数的返回值是什么?
3.阅读程序指出程序功能
voidrestring(HstringS)
{char*p,*q,c;
p=S.ch;
q=S.ch+S.length-1;
while(p<
q)
{c=*p;
*p=*q;
*q=c;
p++;
q--;
四、程序设计题
1.编写算法实现两个串的连接。
2.设计算法删除主串中所有指定子串
3.编写算法判断串是否为回文
同步练习题答案
1.A2.C 3.C 4.A 5.B 6.C 7.D 8.C 9.B 10.C
二、填空题
1.0,包含空格的的数;
2.模式匹配,目标串,模式串;
3.有效位移,无效位移;
4.6;
5.<0;
6.O(m+n);
7.9;
8.串常量,串变量;
9.顺序串,链串;
10.GOODBYE!
1.【答案】判断两个串是否相等,若相等返回1,否则返回0。
2.【答案】
(1)带通配符?
的子串定位函数;
(2)返回值为1。
3.【答案】将一个串逆置。
2.实现两个串的连接算法:
voidstringcat(HstringS,HstringT)
{char*p,*q;
p=S.ch+S.length;
q=t.ch;
S.ch+maxsize&
q<
T.ch+T.length)