数据结构实验报告预习


前言

为了完成学校实验预习而发表的博客,望各位博友对这篇博客海涵。如内容有错误,欢迎在评论区留言。


一、中国计算机设计大赛赛事统计

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平台靠拢,对数据结构考察能更加全面,同时在测试方面能更加简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值