20182327 2019-2020-1 《数据结构与面向对象程序设计》实验八报告
2019-11-16 12:39 BBIowa 阅读(153) 评论(0) 编辑 收藏 举报20182327 2019-2020-1 《数据结构与面向对象程序设计》实验八报告
课程:《程序设计与数据结构》
班级: 1823
姓名:赵天昊
学号:20182327
实验教师:王志强
实验日期:2019年11月7日
必修/选修: 必修
1.实验内容
- 1.参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
- 2.基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
-
- 自己设计并实现一颗决策树
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
- 4.输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
提交测试代码运行截图,要全屏,包含自己的学号信息
2.实验过程和结果
-
实验一:
import java.util.Iterator; public class LinkedBinaryTreeTest { public static void main(String[] args) { LinkedBinaryTree linkedBinaryTree2 = new LinkedBinaryTree(20); LinkedBinaryTree linkedBinaryTree6 = new LinkedBinaryTree(); LinkedBinaryTree linkedBinaryTree1 = new LinkedBinaryTree(18, linkedBinaryTree6, linkedBinaryTree2); LinkedBinaryTree linkedBinaryTree4 = new LinkedBinaryTree(23); LinkedBinaryTree linkedBinaryTree5 = new LinkedBinaryTree(27); LinkedBinaryTree linkedBinaryTree3 = new LinkedBinaryTree(152, linkedBinaryTree5, linkedBinaryTree4); LinkedBinaryTree linkedBinaryTree = new LinkedBinaryTree(460, linkedBinaryTree1, linkedBinaryTree3); Iterator preTree = linkedBinaryTree.iteratorPreOrder(); Iterator postTree = linkedBinaryTree.iteratorPostOrder(); System.out.println("输出树"); System.out.println(linkedBinaryTree.toString()); System.out.println("输出树根的右子树" + linkedBinaryTree.getRight()); System.out.println(("输出根的左子树" + linkedBinaryTree.getLeft())); System.out.println(("输出树的深度" + linkedBinaryTree.getHeight())); System.out.println("是否含有数字460: " + linkedBinaryTree.contains(460)); System.out.println("前序遍历"); linkedBinaryTree.toPreString(); System.out.println("\n后序遍历"); linkedBinaryTree.toPostString();
}
} -
实验二:
public class RunInferenceTree { public static void main(String[] args) { InferenceTree preIn = new InferenceTree(); LinkedBinaryTree<String> linkedBinaryTree = preIn.generate0("ABDHIEJMNCFGKL","HDIBEMJNAFCKGL"); System.out.println("还原这棵树为:"); System.out.println(linkedBinaryTree.toString());
}
} -
实验三:
import java.io.FileNotFoundException;
public class RunDecisionTree {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("让我们做一个小测试");
DecisionTree expert = new DecisionTree("C:\Users\12441\Desktop\game\input.txt");
expert.evaluate();
System.out.println("打印决策树如下:");
System.out.println(expert.getTree().toString());
} -
实验四:
import java.util.Scanner;
import java.util.Stack;public class infixToSuffix{
//输入一个中缀表达式,使用树将中缀表达式转换为后缀表达式
private StacktreeExpression;//操作数栈
private Stack ope;//操作符栈
public infixToSuffix(){
treeExpression = new Stack();
ope = new Stack();
}
private ExpressionTree getOperand(StacktreeExpression){
ExpressionTree temp;
temp = treeExpression.pop();
return temp;
}
public ExpressionTree getPostfixTree(String expression)
{
//得到二叉树
ExpressionTree operand1,operand2;
char operator;
String tempToken;
Scanner parser = new Scanner(expression);
while(parser.hasNext()){
tempToken = parser.next();
operator=tempToken.charAt(0);
if ((operator == '+') || (operator == '-') || (operator'*') ||
(operator == '/')){
if (ope.empty())
ope.push(tempToken);//当储存符号的栈为空时,直接进栈
else{
String a =ope.peek()+"";//转化为String型的数据才能使用equals方法进行判断,否则永远都是false
if (((a.equals("+"))||(a.equals("-")))&&((operator'*')||(operator=='/')))
ope.push(tempToken);//当得到的符号的优先级大于栈顶元素时,直接进栈
else {
String s = String.valueOf(ope.pop());
char temp = s.charAt(0);
operand1 = getOperand(treeExpression);
operand2 = getOperand(treeExpression);
treeExpression.push(new ExpressionTree
(new ExpressionTreeOp(1, temp, 0), operand2, operand1));
ope.push(operator);
}//当得到的符号的优先级小于栈顶元素或者优先级相同时时,数字栈出来两个运算数,形成新的树进栈
}
}
else
treeExpression.push(new ExpressionTree(new ExpressionTreeOp
(2,' ',Integer.parseInt(tempToken)), null, null));
}
while(!ope.empty()){
String a = String.valueOf(ope.pop());
operator = a.charAt(0);
operand1 = getOperand(treeExpression);
operand2 = getOperand(treeExpression);
treeExpression.push(new ExpressionTree
(new ExpressionTreeOp(1, operator, 0), operand2, operand1));
}
return treeExpression.peek();
}
public String getTree()
{
return (treeExpression.peek()).printTree();
}
public int getResult(){
return treeExpression.peek().evaluateTree();
}
public void PostOrder() {
treeExpression.peek().toPostString();
}public static void main(String[] args) {
String again="";
Scanner scan = new Scanner(System.in);
infixToSuffix list = new infixToSuffix();
do{
System.out.println("请输入一个中缀表达式:" + "eg.(3 + 4 * 5)");
String exp = scan.nextLine();
list.getPostfixTree(exp) ;
System.out.println(list.getTree());
System.out.println("后缀表达式为:");
list.PostOrder() ;
System.out.println("\n计算结果为:");
System.out.println(list.getResult());
System.out.println("\n你是否要继续?");
again=scan.nextLine();
}
while (again.equalsIgnoreCase("y"));
}
}
3. 实验过程中遇到的问题和解决过程
-
问题一:调用队列头的数据时,出现了空指针报错
-
问题一解决方法:
重新编辑驱动代码,确认调用无误值已初始化。 -
问题二:在实验三的时候,打印出来的过程全为0,回过去测试实验二,发现实验二也出现了错误。
-
问题二解决方法:
通过单步调试发现错误出在文本文件里面,第一个字符被设置为了空格,直接导致了截取字符出现了问题,提醒我以后的代码实践中要认真考虑到每一个字符的存在意义。 -
问题三:assertEquals上出现一条横线?
-
问题三解决办法:前面定义的实部和虚部都是double型的,我上网查找后发现assertEquals只支持int型,long型或boolean型的,总之在此时不支持(double,double)型的,我就寻思着怎么办啊...然后发现支持(string,string)型的。那就把数字加上""变成字符串,把后面的方法再加一个toString方法转化为字符串,assertEquals上的横线就消失了。
其他(感悟、思考等)
不管是什么树,名称都是LinkedBinaryTree,创建树用树达成目的已经变成目前编程的主流,尽管我自己肯定无法完全掌握,但是能学到东西毕竟是好的吧。