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)
    -  ...

posted @ 2021-11-27 16:33  20202319吕炳翰  阅读(47)  评论(0编辑  收藏  举报