数据结构与算法分析c第三版答案.docx
- 文档编号:9726284
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:21
- 大小:25.79KB
数据结构与算法分析c第三版答案.docx
《数据结构与算法分析c第三版答案.docx》由会员分享,可在线阅读,更多相关《数据结构与算法分析c第三版答案.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构与算法分析c第三版答案
数据结构与算法分析c第三版答案
【篇一:
数据结构第三章习题答案】
txt>#includeiostream
#includestring
usingnamespacestd;
boolhuiwen(strings)
{
intn=s.length();
inti,j;
i=0;
j=n-1;
while(ijs[i]==s[j]){i++;j--;}
if(i=j)returntrue;elsereturnfalse;
}
intmain()
{
strings1;
cins1;
couthuiwen(s1);
return0;
}
=============
(2)设从键盘输入一整数的序列:
a1,a2,a3,…,an,试编写算法实现:
用栈结构存储输入的整数,当ai≠-1时,将ai进栈;当ai=-1时,输出栈顶整数并出栈。
算法应对异常情况(入栈满等)给出相应的信息。
#includeiostream
usingnamespacestd;
#defineoverflow-2
#defineok1
#defineerror0
typedefintselemtype;
typedefintstatus;
typedefstruct{
selemtypea[5];
inttop;
}sqstack;
statusinitstack(sqstacks){
s.top=0;
returnok;
}
statuspush(sqstacks,selemtypee){
if(s.top4){coutoverlow!
endl;returnerror;}
elses.a[s.top++]=e;
returnok;
}
statuspop(sqstacks,selemtypee)
{if(s.top==0){coutunderflowendl;returnerror;}
e=s.a[--s.top];
couteendl;
returnok;
}
intmain()
{sqstacks;
initstack(s);
intn,x,e1;
coutn=?
endl;
cinn;
for(inti=0;in;i++)
{cinx;
if(x!
=-1)push(s,x);elsepop(s,e1);}
return0;
}
============
(3)假设以i和o分别表示入栈和出栈操作。
栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由i和o组成的序列,称可以操作的序列为合法序列,否则称为非法序列。
①下面所示的序列中哪些是合法的?
a.ioiioioob.iooioiioc.iiioioiod.iiiooioo
②通过对①的分析,写出一个算法,判定所给的操作序列是否合法。
若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中)。
intjudge(chara[])
{
i=0;
counti=counto=0;
while(a[i]!
=\0)
{
if(a[i]==i)counti++;
else{
counto++;
if(countocounti)return0;//出栈次数大于入栈次数
}
i++;
}
if(counti!
=counto)return0;
elsereturn1;
}
=======
(4)已知ackermann函数定义如下:
①写出计算ack(m,n)的递归算法,并根据此算法给出出ack(2,1)的计算过程。
②写出计算ack(m,n)的非递归算法。
intack(intm,n)
{if(m==0)return(n+1);
elseif(m!
=0n==0)return(ack(m-1,1));
elsereturn(ack(m-1,ack(m,m-1));
}//算法结束
(1)ack(2,1)的计算过程
ack(2,1)=ack(1,ack(2,0))//因m0,n0而得
=ack(1,ack(1,1))//因m0,n=0而得
=ack(1,ack(0,ack(1,0)))//因m0,n0而得
=ack(1,ack(0,ack(0,1)))//因m0,n=0而得
=ack(1,ack(0,2))//因m=0而得
=ack(1,3)//因m=0而得
=ack(0,ack(1,2))//因m0,n0而得
=ack(0,ack(0,ack(1,1)))//因m0,n0而得
=ack(0,ack(0,ack(0,ack(1,0))))//因m0,n0而得
=ack(0,ack(0,ack(0,ack(0,1))))//因m0,n=0而得
=ack(0,ack(0,ack(0,2)))//因m=0而得
=ack(0,ack(0,3))//因m=0而得
=ack(0,4)//因n=0而得
=5//因n=0而得
(2)intackerman(intm,intn)
{intakm[m][n];inti,j;
for(j=0;jn;j++)akm[0][j];=j+1;
for(i=1;im;i++)
{akm[i][0]=akm[i-1][1];
for(j=1;jn;j++)
akm[i][j]=akm[i-1][akm[i][j-1]];
}
return(akm[m][n]);
}//算法结束
==========
(5)已知f为单链表的表头指针,链表中存储的都是整型数据,试写出实现下列运算的递归算法:
①求链表中的最大整数;
②求链表的结点个数;
③求所有整数的平均值。
#includeiostream
usingnamespacestd;
#defineerror0
#defineok1
typedefintstatus;
typedefintelemtype;
typedefstructlnode{
elemtypedata;
structlnode*next;
}lnode,*linklist;
voidcreatelist_l(linklistl,intn)
{linklistp;
l=newlnode;
l-next=null;
for(inti=n;i0;--i)
{p=(linklist)malloc(sizeof(lnode));
cinp-data;
p-next=l-next;l-next=p;}
}
statuslistinsert_l(linklistl,inti,elemtypee)
{linklistp,s;
intj;
p=l;j=0;
while(pji-1){p=p-next;++j;}
if(!
p||ji-1)returnerror;
s=(linklist)malloc(sizeof(lnode));
s-data=e;
s-next=p-next;
p-next=s;
returnok;
}
voidprint_l(linklistl)
{
linklistp=l-next;
while(p)
{coutp-data,;p=p-next;
}
coutendl;
}
statuslistdelete_l(linklistl,inti,elemtypee)
{linklistp,q;
intj;
p=l,j=0;
while(p-nextji-1){p=p-next;++j;}
if(!
(p-next)||ji-1)returnerror;
q=p-next;
p-next=q-next;
e=q-data;
deleteq;
returnok;
}
intmax(linklistl){
linklistf=l-next;
if(f-next==null)returnf-data;
inttemp=max(f);
if(f-datatemp)returnf-data;
elsereturntemp;
}
intnum(linklistl){
if(l-next==null)return0;
return1+num(l-next);
}
floatavg(linklistl,intn){
linklistf=l-next;
if(f-next==null)
{n=1;return(float)(f-data);}
else{
floatsum=avg(f,n-1)*(n-1);;return(f-data+sum)/n;}}
intmain(){
linklistl;
intn;
coutn=?
;
cinn;
if(n=0){coutn无效,程序终止执行!
endl;exit
(1);}
createlist_l(l,n);
coutmax(l)endl;
coutnum(l)endl;
coutavg(l,n)endl;
return0;
}
【篇二:
数据结构(第3版)习题答案】
lass=txt>高等学校精品资源共享课程
绪论
第1章
1.1什么是数据结构?
【答】:
数据结构是指按一定的逻辑结构组成的一批数据,使用某种存储结构将这批数据存储于计算机中,并在这些数据上定义了一个运算集合。
1.2数据结构涉及哪几个方面?
【答】:
数据结构涉及三个方面的内容,即数据的逻辑结构、数据的存储结构和数据的运算集合。
1.3两个数据结构的逻辑结构和存储结构都相同,但是它们的运算集合中有一个运算的定义不一样,它们是否可以认作是同一个数据结构?
为什么?
【答】:
不能,运算集合是数据结构的重要组成部分,不同的运算集合所确定的数据结构是不一样的,例如,栈与队列它们的逻辑结构与存储结构可以相同,但由于它们的运算集合不一样,所以它们是两种不同的数据结构。
1.4线性结构的特点是什么?
非线性结构的特点是什么?
【答】:
线性结构元素之间的关系是一对一的,在线性结构中只有一个开始结点和一个终端结点,其他的每一个结点有且仅有一个前驱和一个后继结点。
而非线性结构则没有这个特点,元素之间的关系可以是一对多的或多对多的。
1.5数据结构的存储方式有哪几种?
【答】:
数据结构的存储方式有顺序存储、链式存储、散列存储和索引存储等四种方式。
1.6算法有哪些特点?
它和程序的主要区别是什么?
【答】:
算法具有
(1)有穷性
(2)确定性(3)0个或多个输入(4)1个或多个输出(5)可行性等特征。
程序是算法的一种描述方式,通过程序可以在计算机上实现算法。
1.7抽象数据类型的是什么?
它有什么特点?
【答】:
抽象数据类型是数据类型的进一步抽象,是大家熟知的基本数据类型的延伸和发展。
抽象数据类型是与表示无关的数据类型,是一个数据模型及定义在该模型上的一组运算。
对一个抽象数据类型进行定义时,必须给出它的名字及各运算的运算符名,即函数名,并且规定这些函数的参数性质。
一旦定义了一个抽象数据类型及具体实现,程序设计中就可以像使用基本数据类型那样,十分方便地使用抽象数据类型。
抽象数据类型的设计者根据这些描述给出操作的具体实现,抽象数据类型的使用者依据这些描述使用抽象数据类型。
1.8算法的时间复杂度指的是什么?
如何表示?
【答】:
算法执行时间的度量不是采用算法执行的绝对时间来计算的,因为一个算法在不同的机器上执行所花的时间不一样,在不同时刻也会由于计算机资源占用情况的不同,使得算法在同一台计算机上执行的时间也不一样,另外,算法执行的时间还与输入数据的状态有关,所以对于算法的时间复杂性,采用算法执行过程中其基本操作的执行次数,称为计算量来度量。
算法中基本操作的执行次数一般是与问题规模有关的,对于结点个数为n的数据处理问题,用t(n)表示算法基本操作的执行次数。
为了评价算法的执行效率,通常采用大写o符号表示算法的时间复杂度,大写o符号给出了函数f的一个上限。
其它义如下:
3
十二五普通高等教育国家级本科规划教材
高等学校精品资源共享课程
定义:
f(n)=o(g(n))当且仅当存在正的常数c和n0,使得对于所有的n≥n0,有f(n)≤cg(n)。
上述定义表明,函数f顶多是函数g的c倍,除非n小于n0。
因此对于足够大的n(如n≥n0),g是f的一个上限(不考虑常数因子c)。
在为函数f提供一个上限函数g时,通常使用比较简单的函数形式。
比较典型的形式是含有n的单个项(带一个常数系数)。
表1-1列出了一些常用的g函数及其名称。
对于表1-1中的对数函数logn,没有给出对数基,原因是对于任何大于1的常数a和b都有logan=logbn/logba,所以logan和logbn都有一个相对的乘法系数1/logba,其中a是一个常量。
表1-1常用的渐进函数
1.9【答】:
算法的空间复杂度是指算法在执行过程中占用的额外的辅助空间的个数。
可以将它表示为问题规模的函数,并通过大写o符号表示空间复杂度。
1.10对于下面的程序段,分析带下划线的语句的执行次数,并给出它们的时间复杂度t(n)。
(1)i++;
(2)for(i=0;in;i++)
if(a[i]x)x=a[i];
(3)for(i=0;in;i++)
for(j=0;jn;j++)
;
(4)for(i=1;i=n-1;i++)
{k=i;
for(j=i+1;j=n;j++)
if(a[j]a[j+1])k=j;t=a[k];a[k]=a[i];a[i]=t;}
(5)for(i=0;in;i++)
for(j=0;jn;j++)
{++x;s=s+x;}
【答】:
(1)o
(1);
(2)o(n);(3)o(n2);(4)o(n2);(5)o(n2)
4
第2章线性表及其顺序存储
2.1选择题
(1)表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均个数为(为(a)。
a.(n?
1)/2e.n/2
b.nf.(n+1)/2
c.n+1
d.n?
1
g.(n?
2)/2
(2)设栈s和队列q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次通过栈s,一个元素出栈后即进入队列q,若6个元素出队的序列为e2、e4、e3、e6、e5和e1,则栈s的容量至少应该为(c)。
a.6
(b)。
a.不确定
b.n?
i+1
c.i
d.n?
i
(4)在一个长度为n的顺序表中删除第i个元素(1=i=n)时,需向前移动(a)个元素。
a.n?
i
间复杂度为(a)。
a.o(n)
b.o
(1)
c.o(n2)
)。
d.?
+*abcdd.o(n3)
(6)表达式a*(b+c)?
d的后缀表达式是(b
b.n?
i+1
c.n?
i?
1
d.i
(5)若长度为n的线性表采用顺序存储结构存储,在第i个位置上插入一个新元素的时
b.4
c.3
d.2
(3)设栈的输入序列为1、2、3…n,若输出序列的第一个元素为n,则第i个输出的元素为
e),删除一个元素所需移动元素的平均个数
a.abcd*+?
b.abc+*d?
c.abc*+d?
(7)队列是一种特殊的线性表,其特殊性在于(c)。
a.插入和删除在表的不同位置执行b.插入和删除在表的两端位置执行c.插入和删除分别在表的两端执行d.插入和删除都在表的某一端执行(8)栈是一种特殊的线性表,具有(b)性质。
a.先进先出
b.先进后出
c.后进后出
d.顺序进出
(9)顺序循环队列中(数组的大小为n),队头指示front指向队列的第1个元素,队尾指示rear指向队列最后元素的后1个位置,则循环队列中存放了n?
?
?
1个元素,即循环队列满
)。
的条件为(b
a.(rear+1)%n=front?
1c.(rear)%n=front
b.(rear+1)%n=frontd.rear+1=front
(10)顺序循环队列中(数组的大小为6),队头指示front和队尾指示rear的值分别为3和0,当从队列中删除1个元素,再插入2个元素后,front和rear的值分别为(d)。
a.5和1
b.2和4
c.1和5
d.4和2
2.2什么是顺序表?
什么是栈?
什么是队列?
5
【答】:
当线性表采用顺序存储结构时,即为顺序表。
栈是一种特殊的线性表,它的特殊性表现在约定了在这种线性表中数据的插入与删除操作只能在这种线性表的同一端进行(即栈顶),因此,栈具有先进后出、后进先出的特点。
队列也是一种特殊的线性表,它的特殊性表现在约定了在这种线性表中数据的插入在表的一端进行,数据的删除在表的另一端进行,因此队列具有先进先出,后进后出的特点。
2.3设计一个算法,求顺序表中值为x的结点的个数。
【答】:
顺序表的存储结构定义如下(文件名seqlist.h):
#includestdio.h#definen100typedefintdatatype;typedefstruct{
datatypedata[n];intlength;}seqlist;
/*预定义最大的数据域空间*//*假设数据类型为整型*/
/*此处假设数据元素只包含一个整型的关键字域*//*线性表长度*/
/*预定义的顺序表类型*/
算法countx(l,x)用于求顺序表l中值为x的结点的个数。
intcountx(seqlist*l,datatypex){
intc=0;inti;
for(i=0;il-length;i++)
if(l-data[i]==x)c++;returnc;}
2.4设计一个算法,将一个顺序表倒置。
即,如果顺序表各个结点值存储在一维数组a中,倒置的结果是使得数组a中的a[0]等于原来的最后一个元素,a[1]等于原来的倒数第2个元素,…,a的最后一个元素等于原来的第一个元素。
【答】:
顺序表的存储结构定义同题2.3,实现顺序表倒置的算法程序如下:
voidverge(seqlist*l){intt,i,j;i=0;
j=l-length-1;while(ij)
{t=l-data[i];
l-data[i++]=l-data[j];l-data[j--]=t;}}
2.5已知一个顺序表中的各结点值是从小到大有序的,设计一个算法,插入一个值为x的结点,使顺序表中的结点仍然是从小到大有序。
【答】:
顺序表的定义同题2.3,实现本题要求的算法程序如下:
6
voidinsertx(seqlist*l,datatypex){intj;
if(l-lengthn){j=l-length-1;
while(j=0l-data[j]x)
{l-data[j+1]=l-data[j];
j--;}l-data[j+1]=x;l-length++;}}
2.6将下列中缀表达式转换为等价的后缀表达式。
(1)5+6*7
(2)(5-6)/7(3)5-6*7*8(4)5*7-8(5)5*(7-6)+8/9(6)7*(5-6*8)-9【答】:
(7)5+6*7(8)(5-6)/7(9)5-6*7*8(10)5*7-8(11)5*(7-6)+8/9(12)7*(5-6*8)-9
后缀表达式:
567*+后缀表达式:
56-7/后缀表达式:
567*8*-后缀表达式:
57*8-后缀表达式:
576-*89/+后缀表达式:
7568*-*9-
2.7循环队列存储在一个数组中,数组大小为n,队首指针和队尾指针分别为front和rear,请写出求循环队列中当前结点个数的表达式。
【答】:
循环队列中当前结点个数的计算公式是:
(n+rear-front)%n
2.8编号为1,2,3,4的四列火车通过一个栈式的列车调度站,可能得到的调度结果有哪些?
如果有n列火车通过调度站,请设计一个算法,输出所有可能的调度结果。
【答】:
方法一:
算法思想:
逐次输出所有可能,用回溯法。
即:
总体:
对原始序列中的每一个元素,总是先入栈,后出栈
1.入栈后的操作:
a.该元素出栈;b.下一个元素入栈;
2.出栈后的操作:
a.(栈中其他元素)继续出栈;b.(原始序列中)下一个数入栈;注意:
回溯法,关键在于回溯,即在某分支结点x:
处理x的一个子分支,再退回分支x,接着处理x的下一个子分支,若所有x的子分支处理完,再退回上一层分支节点。
所谓“退回”,
7
【篇三:
数据结构(c语言版)课后习题答案完整版】
选择题:
ccbdca
6.试分析下面各程序段的时间复杂度。
(1)o
(1)
(2)o(m*n)(3)o(n2)(4)o(log3n)
(5)因为x++共执行了n-1+n-2+?
?
+1=n(n-1)/2,所以执行时间为o(n2)(6)o(n)
第2章线性表
1.选择题
babadbcabdcddac2.算法设计题
(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
elemtypemax(linklistl){
if(l-next==null)returnnull;
pmax=l-next;//假定第一个结点中数据具有最大值p=l-next-next;
while(p!
=null){//如果下一个结点存在if(p-datapmax-data)pmax=p;p=p-next;}
returnpmax-data;
(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 分析 第三 答案