20202319 《数据结构与面向对象程序设计》实验八报告
# 20202319 2021-2022-1 《数据结构与面向对象程序设计》实验八报告
课程:《程序设计与数据结构》
班级: 2023
姓名: 吕炳翰
学号:20202319
实验教师:王志强
实验日期:2021年11月18日
必修/选修: 必修
一、实验内容
1.参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
2.基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
3.自己设计并实现一颗决策树
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
4.输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
提交测试代码运行截图,要全屏,包含自己的学号信息
二、实验过程及结果
1.参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
码云地址:https://gitee.com/besti2023javads/lv-binghan/commit/9dd795893be2fe92e26a4eaffef9163328922fc0
- BTNode
- LinkedBinaryTree
测试截图
2.基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息课下把代码推送到代码托管平台
- 码云地址:https://e.gitee.com/besti-cs/repos/besti2023javads/lv-binghan/commit/29e781871ed12c9fa1ef3109903d1987b0f61c6d
-
3、自己设计并实现一颗决策树
-
提交测试代码运行截图,要全屏,包含自己的学号信息
-
课下把代码推送到代码托管平台
- Decision
-
package shiyan8_3;
import java.util.Scanner;
public class Decision {
private LinkedBinaryTree<String> tree;
public Decision(){
String e1 = "20202319吕炳翰你认识吗(y(yes) or n(no))";
String e2 = "你知道向岩杰和张修齐还有张焘是谁吗?(y(yes) or n(no))";
String e3 = "是这样的,他很帅,希望你能多去了解他这个人。他的QQ是:1600719729";
String e4 = "你知道他们的最帅的舍友叫什么名字吗?(y(yes) or n(no))";
String e5 = "那没事了,希望你能多多了解他,他舍友就不用了解了。";
String e6 = "真的,他超级帅是吧,非常高兴你能知道他。";
String e7 = "他们最帅的舍友就叫做20202319吕炳翰";
LinkedBinaryTree<String> n2,n3,n4,n5,n6,n7;
n3 = new LinkedBinaryTree<String>(e3);
n5 = new LinkedBinaryTree<String>(e5);
n6 = new LinkedBinaryTree<String>(e6);
n7 = new LinkedBinaryTree<String>(e7);
n4 = new LinkedBinaryTree<String>(e4,n6,n7);
n2 = new LinkedBinaryTree<String>(e2,n4,n5);
tree = new LinkedBinaryTree<String>(e1,n2,n3);
}
public void diagose() throws Exception {
Scanner scan = new Scanner(System.in);
LinkedBinaryTree<String> current = tree;
while(current.size()>1)
{
System.out.println(current.getRootElement());
if(scan.nextLine().equalsIgnoreCase("Y"))
current = current.getLeft();
else
current = current.getRight();
}
System.out.println(current.getRootElement());
}
} - DecisionTest
-
package shiyan8_3;
public class DecisionTest {
public static void main(String[]args) throws Exception {
Decision a = new Decision();
a.diagose();
}
} - 码云地址:https://e.gitee.com/besti-cs/repos/besti2023javads/lv-binghan/commit/f5dbb8afdd6992d8f3fec9f19f57efc7534c33db
4、输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果
-
(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
-
提交测试代码运行截图,要全屏,包含自己的学号信息
- 使用栈的作用fix
-
package shiyan8_4;
import java.util.Stack;
public class Fix {
static Stack<Character> op = new Stack<>();
public static Float getv(char op, Float f1, Float f2) {
if (op == '+') return f2 + f1;
else if (op == '-') return f2 - f1;
else if (op == '*') return f2 * f1;
else if (op == '/') return f2 / f1;
else return Float.valueOf(-0);
}
public static float calrp(String rp) {
Stack<Float> v = new Stack<>();
char[] arr = rp.toCharArray();
int len = arr.length;
for (int i = 0; i < len; i++) {
Character ch = arr[i];
if (ch >= '0' && ch <= '9') v.push(Float.valueOf(ch - '0'));
else v.push(getv(ch, v.pop(), v.pop()));
}
return v.pop();
}
public static String getrp(String s) {
char[] arr = s.toCharArray();
int len = arr.length;
String out = "";
for (int i = 0; i < len; i++) {
char ch = arr[i];
if (ch == ' ') continue;
if (ch >= '0' && ch <= '9') {
out += ch;
continue;
}
if (ch == '(')
op.push(ch);
if (ch == '+' || ch == '-') {
while (!op.empty() && (op.peek() != '('))
out += op.pop();
op.push(ch);
continue;
}
if (ch == '*' || ch == '/') {
while (!op.empty() && (op.peek() == '*' || op.peek() == '/'))
out += op.pop();
op.push(ch);
continue;
}
if (ch == ')') {
while (!op.empty() && op.peek() != '(')
out += op.pop();
op.pop();
continue;
}
}
while (!op.empty()) out += op.pop();
return out;
}
} - test
-
package shiyan8_4;
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入表达式:");
String s = scan.nextLine();
Fix fix = new Fix();
System.out.println("后缀表达式为:\n"+Fix.getrp(s));
System.out.println("计算结果为:\n"+fix.calrp(Fix.getrp(s)));
}
} - 码云地址:https://e.gitee.com/besti-cs/repos/besti2023javads/lv-binghan/commit/5c266ec68242eb94c3df3006154e5ddc7b1da361
3. 实验过程中遇到的问题和解决过程
- 问题1:构建树时没弄清楚树的原理和结构
- 问题解决方案:上百度和云班课复习一遍再加以练习就会更熟悉。-问题2:将中缀表达式转变成后缀表达式时,栈的操作不太熟练导致报错。
-问题解决方案:百度和云班课了解原理,然后再把代码改一遍即可。
实验感悟
java学习可以这样比喻,看上去平平无奇,简单容易,一旦亲身实践起来会发现山重水复,一山放过一山拦。但也不是没有解决的办法,java需要的是不断地练习,遇见新的问题就要挖掘到底,直到把问题给完美解决,另外,再平常的问题也要不断地练习,达到熟练的程度,才能更好的提高自己的编程能力。另外,平时也要多和老师交流编程经验,才能更好地在成为一名有能力的编程师的路上更加前进一步。而且这次实验的树是上学期离散数学学过的,但上学期学的却只是理论知识,但上机操作时,遇到许多递归办法就会开始慌乱,还是要多加以对于编程的练习和理论的学习。
## 参考资料
- [《Java程序设计与数据结构教程(第二版)》](https://book.douban.com/subject/26851579/)
- [《Java程序设计与数据结构教程(第二版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)
- ...