热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

20172324201820191《程序设计与数据结构》实验2报告

201723242018-2019-1《程序设计与数据结构》实验2报告课程:《程序设计与数据结构》班级:1723姓名:曾程学号࿱

20172324 2018-2019-1《程序设计与数据结构》实验2报告

课程:《程序设计与数据结构》
班级: 1723
姓名: 曾程
学号:20172324
实验教师:王志强
实验日期:2018年9月30日
必修/选修: 必修

一、实验内容

链表练习

  • 实验一:参考教材p212,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder

    1. 用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
  • 实验二:基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能
    1. 比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树

    2. 用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息

  • 实验三:自己设计并实现一颗决策树

  • 实验四:输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果
    1. 如果没有用树,则为0分
    2. 提交测试代码运行截图,要全屏,包含自己的学号信息
  • 实验五:完成PP11.3
  • 实验六::参考http://www.cnblogs.com/rocedu/p/7483915.html对Java中的红黑树(TreeMap,HashMap)进行源码分析,并在实验报告中体现分析结果

二、实验过程及结果

  • 实验1结果截图:

    • LinkedBinaryTree中有给出getLeft的方法,所以根据所给的getLeft补写出getRight方法
    • 书上说:contains方法留作程序设计项目,它可以使用find方法判定目标元素是否存在于树中
    • LinkedBinaryTree要补写preorder,postorder,LinkedBinaryTree中给出了inorder的方法,根据inorder写出preorder和postorder
      1332976-20181111155951948-522164646.png
  • 实验2结果截图:

    • 前序是:根左右的顺序,中序是左根右的顺序。首先找root,前序的第一个是root;观察前序,除根之外的必在左右子树;观察中序,root左侧的为左子树,右侧的为右子树;在左子树和右子 树中根据前序再判断谁是根;同样道理,以此类推
      1332976-20181111160023000-1549081928.png
  • 实验3结果截图:
    1332976-20181111160036477-230054629.png

  • 实验4结果截图:
    1332976-20181111160056665-1161841329.png

  • 实验5结果截图:
    二叉搜索树是一种特殊的二叉树,即:节点的左子节点的值都小于这个节点的值,节点的右子节点的值都大于等于这个节点的值
    比根节点要小的数会放在当前根节点的左子结点,因此要实现findMin()只要获取该树的最左边的结点即是最小值
    比根节点要大的数会放在当前根节点的右子结点,因此要实现findMax()只要获取该树的最右边的结点即是最大值

1332976-20181111160106097-80176676.png

  • 实验6分析:
    最后一个实验是对Java中的红黑树(TreeMap,HashMap)进行源码分析,首先要了解红黑树是什么,第七周博客中有提到过。
    TreeMap类

public class TreeMapextends AbstractMapimplements NavigableMap, Cloneable, java.io.Serializable

  • TreeMap(K,V) K - 此映射维护的键的类型 V - 映射值的类型
  • TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。
  • TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
  • TreeMap 实现了Cloneable接口,意味着它能被克隆。
  • TreeMap 实现了java.io.Serializable接口,意味着它支持序列化。
  • TreeMap() 使用键的自然顺序构造一个新的、空的树映射。
  • TreeMap(Comparator comparator) 构造一个新的、空的树映射,该映射根据给定比较器进行排序。
  • TreeMap(Map m) 构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序。
  • TreeMap(SortedMap m) 构造一个与指定有序映射具有相同映射关系和相同排序顺序的新的树映射。
    firstEntry()和getFirstEntry()方法:

public Map.Entry firstEntry() {return exportEntry(getFirstEntry());
}
final Entry getFirstEntry() {Entry p = root;if (p != null)while (p.left != null)p = p.left;return p;
}

firstEntry() 和 getFirstEntry() 都是用于获取第一个节点。firstEntry() 是对外接口;getFirstEntry() 是内部接口。而且,firstEntry() 是通过 getFirstEntry() 来实现的。
那么为什么不直接调用getFirstEntry() ,而调用 firstEntry() 呢?这么做的目的是:防止用户修改返回的Entry。getFirstEntry()返回的Entry是可以被修改的,但是经过firstEntry()返回的Entry不能被修改,只可以读取Entry的key值和value值。

HashMap类
初始容量与加载因子是影响HashMap的两个重要因素:

public HashMap(int initialCapacity, float loadFactor)

初始容量默认值:

/*** The default initial capacity - MUST be a power of two.*/static final int DEFAULT_INITIAL_CAPACITY &#61; 1 <<4; // aka 16

加载因子默认值&#xff1a;

/*** The load factor used when none specified in constructor.*/static final float DEFAULT_LOAD_FACTOR &#61; 0.75f;

  • HashMap K - 此映射所维护的键的类型 V- 所映射值的类型
  • HashMap() 构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
  • HashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。
  • HashMap(int initialCapacity, float loadFactor) 构造一个带指定初始容量和加载因子的空 HashMap。
  • HashMap(Map m) 构造一个映射关系与指定 Map 相同的新 HashMap。
    如果在map中包含对应的特定的键值则返回true&#xff0c;否则返回false。
    方法有些类似于contains方法&#xff0c;在功能上contains检测是否有对应关联的键&#xff0c;containsValue检测是否有对应的值&#xff0c;内部使用V&#xff08;泛型&#xff09;定义一个值&#xff0c;而Node实现了Map.Entry这个接口&#xff0c;每个key-value都放在了Node这个对象中&#xff0c;采用 Node[] tab 数组的方式来保存key-value对&#xff0c;之后判断tab数组是否为空&#xff0c;size是transient声明的实例变量&#xff0c;确保其大于0后&#xff0c;遍历存放key-value的tab数组&#xff0c;每对键值又定义了e来保存并遍历&#xff0c;直到e对应的下一个值为空&#xff0c;将e对应的某值赋给v&#xff0c;最后判断是否和指定值地址相同&#xff0c;或者判断是否键值不为空并且字符完全相同&#xff0c;至少一者成立才能返回true&#xff0c;比之前链表中contains方法的开销、时间复杂度更大。

    三、实验过程中遇到的问题和解决过程

  • 问题一&#xff1a;实验四的思考过程

  • 问题一解决方案&#xff1a;根据上学期学习的后缀表达式的特点&#xff0c;我们可以知道&#xff0c;只要是运算符的就都是根结点。我们这里需要使用一个栈来保存字符。遍历后缀表达式&#xff0c;每当遇到是非运算符的字符&#xff0c;就将它入栈&#xff0c;当遇到是运算符&#xff0c;就将栈中前两个结点出栈&#xff0c;和运算符组成一棵子树&#xff0c;然后入栈。遍历完成后&#xff0c;栈中剩下的唯一的一个结点就是该后缀表达式的二叉树的根结点。但是做着做着发现好像和书上提供的代码是一样的&#xff0c;Java实验肯定不会只是书上的代码&#xff0c;然后仔细分析了题目发现和书上不一样的地方在书上是直接输入后缀表达式&#xff0c;实验要求的是利用树将中缀转后缀之后再用后缀表达式计算。大概想法就变成了将表达式的每一个元素进行拿出&#xff0c;按照数字、加减运算符、乘除运算符分成三种情况&#xff0c;用两个栈或者链表进行保存加减和构成树的结点。

四、其他&#xff08;感悟、思考等&#xff09;

五、参考资料

  • Java Collections API源码分析

转载于:https://www.cnblogs.com/amberR/p/9942355.html


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
author-avatar
嗯明天娶你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有