文章目录
前言
为了完成学校实验预习而发表的博客,望各位博友对这篇博客海涵。如内容有错误,欢迎在评论区留言。
一、中国计算机设计大赛赛事统计
1.问题描述
参加计算机设计大赛的n个学校编号为1-n,赛事分成m个项目,项目的编号为1-m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。
2.基本要求
1)每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;
2)能统计各学校的总分;
3)可以按照学校编号或名称,学校的总分、各项目的总分排序输出;
4)可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;
5)数据存入文件并能随时查询
3.问题分析
本题基本用到算法和数据结构是排序算法和结构体,简单的冒泡排序即可满足该需求,STL库中方便且强大的sort也可以满足该需求,结构体作为最基础的数据结构不予讲解。第五点要求属于OI流的知识,并不属于数据结构和算法中。
4.核心代码
给出一个快排的基本模板,核心思想是分治:
void quick_sort(int q[], int l, int r){
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j){
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
二、校园导游咨询
1.问题描述
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
2.基本要求
(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
3.问题分析
本题是一道简单的无向图+单源最短路径,通过基础的dijkstra算法即可满足问题需求。对于小规模的数据量可以使用邻接矩阵,对于大规模的数据量可以使用链式前向星或者堆来进行优化。
4.核心代码
代码如下:
dijkstra核心逻辑:
res[pos]=0;//pos为起点
while(!book[pos]){//逐点遍历
book[pos]=true;
for(int i=1;i<=n;i++){
if(!book[i]&&res[i]>res[pos]+mp[pos][i]){//核心:松弛
res[i]=res[pos]+mp[pos][i];
}
}
int minn=MAX;//使用贪心进行pos的更新
for(int i=1;i<=n;i++){
if(!book[i]&&res[i]<minn){
minn=res[i];
pos=i;
}
}
}
链式前向星对空间的优化:
struct Edge{
int to;
int w;
int next;
}edge[500001];
void add_edge(int u,int v,int w){
edge[++cnt].to=v;//更新指向点
edge[cnt].w=w;//更新权值
edge[cnt].next=head[u];//插入至链式前向星中
head[u]=cnt;//更新链头
}
三、算术表达式求解
1.问题描述
设计一个简单的算术表达式计算器。
2.基本要求
实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入)。
3.问题分析
常见的后缀表达式处理,需要注意运算符优先级的排序,使用STL库中的栈(stack)加上逻辑判断即可解决该问题。
4.核心代码
代码如下:
if(judge(s[i])){//如果是数,直接存入栈
int sum=0;
while(judge(s[i])){
sum=sum*10+(s[i++]-'0');
}
num.push(sum);
i--;
}else{
if(op.empty()||s[i]=='('){//如果没操作符或者是左括号,直接存入栈
op.push(s[i]);
}else if(s[i]==')'){//如果是右括号,直接出栈至左括号
while(op.top()!='('){
cal(op.top());
op.pop();
}
op.pop();
}else{
char q=s[i];
char p=op.top();
if(pri(q)>pri(p)){//如果运算优先级高,直接存入栈
op.push(q);
}else{
while(pri(q)<=pri(p)){//出栈至优先级比栈顶高
cal(p);
op.pop();
if(!op.empty()){//判断栈中是否还有操作符能比较
p=op.top();
}else{
p='#';
}
p=op.top();
}
op.push(q);
}
}
}
总结
以上是数据结构实验报告预习的所有内容。总结来说用到的算法和数据结构都是比较简单的,然而题目的测试样例和测试要求过于冗长,对于数据结构和算法这个标题有些喧宾夺主,着重考察的方面应该在于数据结构上。本次实验的提升和收获一般,希望题目的设计能向各种OJ平台靠拢,对数据结构考察能更加全面,同时在测试方面能更加简洁。