代码改变世界

20182327 2019-2020-1 《数据结构与面向对象程序设计》实验八报告

2019-11-16 12:39  BBIowa  阅读(152)  评论(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或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息

课下把代码推送到代码托管平台

    1. 自己设计并实现一颗决策树

提交测试代码运行截图,要全屏,包含自己的学号信息

课下把代码推送到代码托管平台

  • 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 Stack treeExpression;//操作数栈
    private Stack ope;//操作符栈
    public infixToSuffix(){
    treeExpression = new Stack();
    ope = new Stack();
    }
    private ExpressionTree getOperand(Stack treeExpression){
    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,创建树用树达成目的已经变成目前编程的主流,尽管我自己肯定无法完全掌握,但是能学到东西毕竟是好的吧。