数据结构课设

项目1:中国计算机设计大赛赛事统计

设计目标:

        1,能统计各学校的总分

        2,能按照学校编号或者名称,将学校的总分或者各项目的总分排序输出

        3,能够按照编号查询学校某个项目的获奖情况

        4,可以按照项目编号查询取得前三名的学校

        5,数据能够存入文件并随时查询

设计要求:

        1,每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;每个队伍只能参加一项比赛

        2,输入形式:输入学校的名称和赛事项目

        3,界面要求:交互设计合理;根据提示完成相关功能的要求

        4,存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中

设计思路:

数据结构:

data:

list--存储所有的data

方法一,主函数 

创建dataStorage类存储学校信息,id,name,int[](参加的项目)

用list来存放dataStorage

定义choice变量,打印菜单,用户根据提示输入选择。通过while循环实现交互

方法二,菜单实现

1,初始化信息
2,统计各学校总分
3,按学校名称显示学校总分
4,按学校名称或编号显示各项目总分排序
5,按学校编号查询某个项目的获奖状况
6,按项目编号查询取得前三名的学校
7,打印所有学校信息
8,保存文件
9,读取文件
0,退出

方法三,初始化信息

创建dataStorage对象并通过Scanner来键盘输入信息,输入学校名、编号、队伍数目、队伍名、参赛项目和得分。创建完毕后用list统一存储。输入完后通过Java语言的序列化存储到本地txt文件上,为避免重复输入,每次直接读取已经保存的序列化文件。

方法四,统计各学校总分

循环访问list,用迭代器访问list中的每一个元素的map中的分数,累加得到总分

方法五,按照学校名称显示各项目排序

输入学校的名称或者编号,遍历list找到对应的学校,用迭代器访问整个数据,根据项目名来得到不同项目的总分

方法六,通过学校名称显示学校总分

通过输入学校名找到对应的list中的元素,通过迭代器访问所有的成绩并进行累加,得到该学校的总分

方法七,找到项目的前三名学校名称

输入项目名称,新建list1存储学校名和得分;通过迭代器访问得到list元素中的所有数据,通过比较项目名称得到前三名的数据

方法八,找到学校的项目奖项

通过方法七能够得到各个项目的前三名,新建map将每个前三名的学校和奖项村粗,全部存储后进行遍历,通过匹配输入的学校名和map中的学校名是否相等来判断是否输出

文件的保存和读取

通过Java语言的序列化来实现存储自定义类型数据

项目2:校园导游咨询

【问题描述】

设计一个校园导游程序,为来访的客人提供各种信息查询服务。

【基本要求】

(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。

(2) 为来访客人提供图中任意景点相关信息的查询。

(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。

【数据结构】

dt

{

        景点编号;(int)

        景点名称;(String)

        景点描述;(String)

}

【景点选择】(以江苏科技大学地图为例)

文理大楼、东苑、西操场、西苑、北苑、图书馆、梦溪园、文体中心、东操场、杨帆广场

初始化信息后将所有的景点信息存储到array数组中

【拓扑图如下】

【无向图实现】

用二维数组表示无向图

 

graph[i][j]代表第i个景点和第j个景点之间的距离;若距离为INF,则代表无限大,两者之间不能达到

【无向图和dt建立连接】 

通过无向图的下标=景点id-1的关系建立连接

【方法实现】

查询信息-首先通过菜单将所有的景点信息和编号呈现给用户,让用户输入景点的编号,遍历访问数组array比较输入的id和数字每个元素的id,找到对应的景点后打印输出。

查询路径-通过键盘输入当前景点和目标景点,两者的数值-1对应无向图矩阵的下标。用dijkstra算法实现

【详情B站搜索-最短路径算法】

通过此算法得到当前景点到所有景点的最短距离,在代码实现中,创建新的数组(list1)保存节点访问顺序;访问整个保存结点访问的数组list1一直到数组元素为目标景点,进而得到最短路径的长度和路线

项目3:算术表达式计算器

目标:

实现简单的计算:+、-、*、/、(、)

实现思路:

【按照先乘除后加减,先左后右,先括号里后括号外的顺序,得到操作符优先关系表(7*7的二维数组】

将信息存入map中

symLvMap.put('=', 0);

symLvMap.put('-', 1);

symLvMap.put('+', 1);

symLvMap.put('*', 2);

symLvMap.put('/', 2);

symLvMap.put('(', 3);

symLvMap.put(')', 1);

1,创建两个栈:存放操作符的OPTR和存放数字的OPND

2,输入字符串,每次读取一个字符a

3,判断a是否为数字:

        将a压入OPND

        和当前OPTR栈顶元素b比较优先级,优先级高则将a直接压栈;优先级低则先将b出栈,后将a入栈

4,遍历访问两个栈,根据操作符的不同实现不同的算法,当操作符出栈元素为#时代表已经计算完毕,程序结束

重点:

检验括号是否匹配

LinkedList<Character> stack = new LinkedList<>();
for (char c : str.toCharArray()) {
   
if (c == '(') {
        stack.add(c);
    }
else if (c == ')') {
       
if (stack.isEmpty()) {
           
return false;
        }
        stack.removeLast();
    }
}

if (stack.isEmpty()) {
   
return true;
}
else {
   
return false;
}

对于负数的操作,在字符串处理的时候进行补充0的操作,例如,将-1转换为(0-1)的形式

 if ('-' == str.charAt(0)) {

     str = 0 + str;

}

对于直接用8(7-4)这种形式,在对字符串进行处理的时候将“(”补齐为“*(”的形式。

if (i != 0 && c == '(' && (isCharNum(str.charAt(i - 1)) || str.charAt(i - 1) == ')')) {
    sb.append(
"*(");
   
continue;
}

对于操作符栈,i-代表当前操作符,j-代表上一个操作符,如果i的优先级>j的优先级,则直接入栈,反之则先把i操作符出栈,再把j入栈,再把i入栈,同时对括号处理的时候,当出现一堆括号则将括号里面的内容计算后压入数字栈。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值