没有合适的资源?快使用搜索试试~ 我知道了~
首页数据结构习题详解与C语言实现
数据结构习题详解与C语言实现
需积分: 4 0 下载量 189 浏览量
更新于2024-07-23
收藏 258KB PDF 举报
"这是一份关于数据结构的详细学习教程,包含对严蔚敏《数据结构(c语言版)习题集》中的算法设计题目的解答。解答由kaoyan.com计算机版版主一具编写,并得到多位网友的修订和完善。解答采用类C语言描述算法,但并不保证所有程序都能上机运行。解答旨在帮助读者理解思路,而非直接提供运行解决方案。读者应在尝试解决问题后,再参考解答以提高学习效果。文档中还指出了一些未解的题目,并鼓励读者发现并纠正错误,提出改进算法的建议。" 在这份教程中,讲解了数据结构的基本概念,通过实例展示了如何处理和组织数据。例如,1.16题提供了一个按降序输出三个整数的函数`print_descending`,使用冒泡排序的方法进行交换,使得数值由大到小排列。这个例子介绍了基本的排序思想,虽然简单,但对于理解排序算法有重要作用。 另一道题目1.17题`fib`函数用于计算斐波那契序列的第m项值,采用了动态规划的方法,先初始化序列的前几项,然后逐步计算后续项。这种方法优化了时间复杂度,使其降低到O(m^2),减少了不必要的重复计算。 这些题目解答旨在帮助读者深入理解数据结构中的基础概念,如排序算法和递推序列的计算。通过对这些具体问题的解答,读者可以更好地掌握数据结构的核心原理,如时间复杂度分析和算法设计技巧。同时,这份教程强调了实践和思考的重要性,鼓励读者在遇到问题时先尝试自己解决,然后对照解答进行反思,以此提升自己的编程和算法设计能力。
资源详情
资源推荐
}
}//for
if(!StackEmpty(s)) return ERROR;
return OK;
}//AllBrackets_Test
3.20
typedef struct {
. int x;
int y;
} coordinate;
void Repaint_Color(int g[m][n],int i,int j,int color)// 把点 (i,j )
相邻区域的颜色置换为 color
{
old=g[i][j];
InitQueue(Q);
EnQueue(Q,{I,j});
while(!QueueEmpty(Q))
{
DeQueue(Q,a);
x=a.x;y=a.y;
if(x>1)
if(g[x-1][y]==old)
{
g[x-1][y]=color;
EnQueue(Q,{x-1,y}); // 修改左邻点的颜色
}
if(y>1)
if(g[x][y-1]==old)
{
g[x][y-1]=color;
EnQueue(Q,{x,y-1}); // 修改上邻点的颜色
}
if(x<m)
if(g[x+1][y]==old)
{
g[x+1][y]=color;
EnQueue(Q,{x+1,y}); // 修改右邻点的颜色
}
if(y<n)
if(g[x][y+1]==old)
{
g[x][y+1]=color;
EnQueue(Q,{x,y+1}); // 修改下邻点的颜色
}
}//while
}//Repaint_Color
分析 : 本算法采用了类似于图的广度优先遍历的思想 , 用两个队列保存相
邻同色点的横坐标和纵坐标 . 递归形式的算法该怎么写呢 ?
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
剩余35页未读,继续阅读
insist321
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 计算机人脸表情动画技术发展综述
- 关系数据库的关键字搜索技术综述:模型、架构与未来趋势
- 迭代自适应逆滤波在语音情感识别中的应用
- 概念知识树在旅游领域智能分析中的应用
- 构建is-a层次与OWL本体集成:理论与算法
- 基于语义元的相似度计算方法研究:改进与有效性验证
- 网格梯度多密度聚类算法:去噪与高效聚类
- 网格服务工作流动态调度算法PGSWA研究
- 突发事件连锁反应网络模型与应急预警分析
- BA网络上的病毒营销与网站推广仿真研究
- 离散HSMM故障预测模型:有效提升系统状态预测
- 煤矿安全评价:信息融合与可拓理论的应用
- 多维度Petri网工作流模型MD_WFN:统一建模与应用研究
- 面向过程追踪的知识安全描述方法
- 基于收益的软件过程资源调度优化策略
- 多核环境下基于数据流Java的Web服务器优化实现提升性能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功