没有合适的资源?快使用搜索试试~ 我知道了~
首页严蔚敏《数据结构C语言习题集》详解与答案
严蔚敏《数据结构C语言习题集》详解与答案
需积分: 0 4 下载量 139 浏览量
更新于2024-08-02
收藏 370KB PDF 举报
严蔚敏的《数据结构(C语言版)习题集》是一本针对计算机科学中重要概念——数据结构的经典教材,该书习题集的答案详细且全面地覆盖了书中算法设计部分。作者以kaoyan.com计算机版版主一具为主导,汇集了网友siice、龙抬头、iamkent、zames、birdthinking等人的贡献,共同完成了答案的修订和完善。 答案部分注重实用性,所有算法采用类C语言进行描述,目的是便于交流和阅读理解,但需要注意的是,由于教学性质,作者并不保证提供的代码可以直接在所有环境下正常运行。对于复杂或独特思路的问题,答案可能包含源代码和简要分析,而对于未解决的题目如5.20和10.40,仅提供必要的讨论。 章节1.16中,`print_descending`函数用于按从大到小的顺序输出三个整数。通过嵌套的条件判断和交换操作,实现了冒泡排序算法,最后打印出排序后的结果。1.17题是关于求解k阶斐波那契序列的第m项,`fib`函数采用了记忆化搜索的方法,通过保存中间计算结果,显著减少了重复计算,提高了效率。该函数首先检查输入的合理性,然后使用两层循环计算斐波那契数列,并在循环结束后返回第m项的值。 值得注意的是,该解答鼓励读者在尝试解决问题和深入思考后再查阅答案,以增强自我学习的效果。同时,作者也提醒读者,由于作者的知识和技能有限,可能存在错误和不足,鼓励读者在阅读时积极发现并提出改进建议,共同提升解题技巧。 总结来说,这本习题集答案集不仅提供了实用的编程技巧,还包含了对算法设计思想的讲解,是学习数据结构与C语言实践的好参考资料。
资源详情
资源推荐
分析:本算法采用了类似于图的广度优
先遍历的思想,用两个队列保存相邻同
色点的横坐标和纵坐标.递归形式的算
法该怎么写呢?
3.21
void NiBoLan(char *str,char *new)//把
中缀表达式 str 转换成逆波兰式 new
{
p=str;q=new; //为方便起见,设 str 的两
端都加上了优先级最低的特殊符号
InitStack(s); //s 为运算符栈
while(*p)
{
if(*p 是字母)) *q++=*p; //直接输出
else
{
c=gettop(s);
if(*p 优先级比 c 高) push(s,*p);
else
{
while(gettop(s)优先级不比*p 低)
{
pop(s,c);*(q++)=c;
}//while
push(s,*p); //运算符在栈内遵循越
往栈顶优先级越高的原则
}//else
}//else
p++;
}//while
}//NiBoLan //参见编译原理教材
3.22
int GetValue_NiBoLan(char *str)//对逆
波兰式求值
{
p=str;InitStack(s); //s 为操作数栈
while(*p)
{
if(*p 是数) push(s,*p);
else
{
pop(s,a);pop(s,b);
r=compute(b,*p,a); //假设 compute
为执行双目运算的过程
push(s,r);
}//else
p++;
}//while
pop(s,r);return r;
}//GetValue_NiBoLan
3.23
Status NiBoLan_to_BoLan(char
*str,stringtype &new)//把逆波兰表达式
str 转换为波兰式 new
{
p=str;Initstack(s); //s 的元素为
stringtype 类型
while(*p)
{
if(*p 为字母) push(s,*p);
else
{
if(StackEmpty(s)) return ERROR;
pop(s,a);
if(StackEmpty(s)) return ERROR;
pop(s,b);
c=link(link(*p,b),a);
push(s,c);
}//else
p++;
}//while
pop(s,new);
if(!StackEmpty(s)) return ERROR;
return OK;
}//NiBoLan_to_BoLan
分析:基本思想见书后注释.本题中暂
不考虑串的具体操作的实现,而将其看
作一种抽象数据类型 stringtype,对其可
以进行连接操作:c=link(a,b).
3.24
Status g(int m,int n,int &s)//求递归函数
g 的值 s
{
if(m==0&&n>=0) s=0;
else if(m>0&&n>=0) s=n+g(m-1,2*n);
else return ERROR;
return OK;
}//g
3.25
Status F_recursive(int n,int &s)//递归算
法
{
if(n<0) return ERROR;
if(n==0) s=n+1;
else
{
F_recurve(n/2,r);
s=n*r;
}
return OK;
}//F_recursive
Status F_nonrecursive(int n,int s)//非递
归算法
{
if(n<0) return ERROR;
if(n==0) s=n+1;
else
{
InitStack(s); //s 的元素类型为 struct
{int a;int b;}
while(n!=0)
{
a=n;b=n/2;
push(s,{a,b});
n=b;
}//while
s=1;
while(!StackEmpty(s))
{
pop(s,t);
s*=t.a;
}//while
}
return OK;
}//F_nonrecursive
3.26
float Sqrt_recursive(float A,float p,float
e)//求平方根的递归算法
{
if(abs(p^2-A)<=e) return p;
else return sqrt_recurve(A,(p+A/p)/2,e);
}//Sqrt_recurve
float Sqrt_nonrecursive(float A,float
p,float e)//求平方根的非递归算法
{
while(abs(p^2-A)>=e)
p=(p+A/p)/2;
return p;
}//Sqrt_nonrecursive
3.27
这一题的所有算法以及栈的变化过程
请参见《数据结构(pascal 版)》,作者不
再详细写出.
3.28
void InitCiQueue(CiQueue &Q)//初始
化循环链表表示的队列 Q
{
Q=(CiLNode*)malloc(sizeof(CiLNode
));
Q->next=Q;
}//InitCiQueue
void EnCiQueue(CiQueue &Q,int x)//把
元素 x 插入循环链表表示的队列 Q,Q
指向队尾元素,Q->next 指向头结
点,Q->next->next 指向队头元素
{
p=(CiLNode*)malloc(sizeof(CiLNode)
);
p->data=x;
p->next=Q->next; //直接把 p加在 Q的
后面
Q->next=p;
Q=p; //修改尾指针
}
Status DeCiQueue(CiQueue &Q,int x)//
从循环链表表示的队列 Q 头部删除元
素 x
{
if(Q==Q->next) return INFEASIBLE;
//队列已空
p=Q->next->next;
x=p->data;
Q->next->next=p->next;
free(p);
return OK;
}//DeCiQueue
3.29
Status EnCyQueue(CyQueue &Q,int x)//
带 tag 域的循环队列入队算法
{
if(Q.front==Q.rear&&Q.tag==1) //tag
域的值为 0 表示"空",1 表示"满"
return OVERFLOW;
Q.base[Q.rear]=x;
Q.rear=(Q.rear+1)%MAXSIZE;
if(Q.front==Q.rear) Q.tag=1; //队列满
}//EnCyQueue
Status DeCyQueue(CyQueue &Q,int
&x)//带 tag 域的循环队列出队算法
{
if(Q.front==Q.rear&&Q.tag==0) return
INFEASIBLE;
Q.front=(Q.front+1)%MAXSIZE;
x=Q.base[Q.front];
if(Q.front==Q.rear) Q.tag=1; //队列空
return OK;
}//DeCyQueue
分析:当循环队列容量较小而队列中每
个元素占的空间较多时,此种表示方法
可以节约较多的存储空间,较有价值.
3.30
Status EnCyQueue(CyQueue &Q,int x)//
带 length 域的循环队列入队算法
{
if(Q.length==MAXSIZE) return
OVERFLOW;
Q.rear=(Q.rear+1)%MAXSIZE;
Q.base[Q.rear]=x;
Q.length++;
return OK;
}//EnCyQueue
Status DeCyQueue(CyQueue &Q,int
&x)//带 length 域的循环队列出队算法
{
if(Q.length==0) return INFEASIBLE;
head=(Q.rear-Q.length+1)%MAXSIZE;
//详见书后注释
x=Q.base[head];
Q.length--;
}//DeCyQueue
3.31
int Palindrome_Test()//判别输入的字符
串是否回文序列,是则返回 1,否则返回
0
{
InitStack(S);InitQueue(Q);
while((c=getchar()!='@')
{
Push(S,c);EnQueue(Q,c); //同时使用
栈和队列两种结构
}
while(!StackEmpty(S))
{
Pop(S,a);DeQueue(Q,b));
if(a!=b) return ERROR;
}
return OK;
}//Palindrome_Test
3.32
void GetFib_CyQueue(int k,int n)//求 k
阶斐波那契序列的前 n+1 项
{
InitCyQueue(Q); //其 MAXSIZE 设置
为 k
for(i=0;i<k-1;i++) Q.base[i]=0;
Q.base[k-1]=1; //给前 k 项赋初值
for(i=0;i<k;i++) printf("%d",Q.base[i]);
for(i=k;i<=n;i++)
{
m=i%k;sum=0;
for(j=0;j<k;j++)
sum+=Q.base[(m+j)%k];
Q.base[m]=sum; //求第 i 项的值存入
队列中并取代已无用的第一项
printf("%d",sum);
}
}//GetFib_CyQueue
3.33
Status EnDQueue(DQueue &Q,int x)//
输出受限的双端队列的入队操作
{
if((Q.rear+1)%MAXSIZE==Q.front)
return OVERFLOW; //队列满
avr=(Q.base[Q.rear-1]+Q.base[Q.front]
)/2;
if(x>=avr) //根据 x 的值决定插入在队
头还是队尾
{
Q.base[Q.rear]=x;
Q.rear=(Q.rear+1)%MAXSIZE;
} //插入在队尾
else
{
Q.front=(Q.front-1)%MAXSIZE;
Q.base[Q.front]=x;
} //插入在队头
return OK;
}//EnDQueue
Status DeDQueue(DQueue &Q,int &x)//
输出受限的双端队列的出队操作
{
if(Q.front==Q.rear) return
INFEASIBLE; //队列空
x=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return OK;
}//DeDQueue
3.34
void Train_Rearrange(char *train)//这里
用字符串 train 表示火车,'P'表示硬
座,'H'表示硬卧,'S'表示软卧,最终按
PSH 的顺序排列
{
r=train;
InitDQueue(Q);
while(*r)
{
if(*r=='P')
{
printf("E");
printf("D"); //实际上等于不入队列,
直接输出 P 车厢
}
else if(*r=='S')
{
printf("E");
EnDQueue(Q,*r,0); //0 表示把 S 车
厢从头端入队列
}
else
{
printf("A");
EnDQueue(Q,*r,1); //1 表示把 H 车
厢从尾端入队列
}
}//while
while(!DQueueEmpty(Q))
{
printf("D");
DeDQueue(Q);
}//while //从头端出队列的车厢必然
是先 S 后 H 的顺序
}//Train_Rearrange
剩余78页未读,继续阅读
feng_yuewuxian
- 粉丝: 4
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- JDK 17 Linux版本压缩包解压与安装指南
- C++/Qt飞行模拟器教员控制台系统源码发布
- TensorFlow深度学习实践:CNN在MNIST数据集上的应用
- 鸿蒙驱动HCIA资料整理-培训教材与开发者指南
- 凯撒Java版SaaS OA协同办公软件v2.0特性解析
- AutoCAD二次开发中文指南下载 - C#编程深入解析
- C语言冒泡排序算法实现详解
- Pointofix截屏:轻松实现高效截图体验
- Matlab实现SVM数据分类与预测教程
- 基于JSP+SQL的网站流量统计管理系统设计与实现
- C语言实现删除字符中重复项的方法与技巧
- e-sqlcipher.dll动态链接库的作用与应用
- 浙江工业大学自考网站开发与继续教育官网模板设计
- STM32 103C8T6 OLED 显示程序实现指南
- 高效压缩技术:删除重复字符压缩包
- JSP+SQL智能交通管理系统:违章处理与交通效率提升
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功