JAVA第十二章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
© 2004 Pearson Addison-Wesley. All rights reserved
12-16
典型的数据类型
• 我们将要研究一些比较典型的数据类型 • 典型的线性数据结构包括栈和队列 • 典型的非线性数据结构包括树和图
ห้องสมุดไป่ตู้
© 2004 Pearson Addison-Wesley. All rights reserved
二叉树
• 在二叉树中,每一个节点可以拥有不多于两个的子结点 在二叉树中, • 一个二叉树可以被递归地定义,它可能为空,可能有一 一个二叉树可以被递归地定义,它可能为空, 个根和两个子树, 个根和两个子树,而这两个子树又都是二叉树 • 树通常用动态链替代引用的方法来表示,但是却不能用 树通常用动态链替代引用的方法来表示, 固定的表示方法来表示树, 固定的表示方法来表示树,例如数组 • 对于二叉树,每一个节点都只需要储存两个链来指向它 对于二叉树, 的左孩子和右孩子
© 2004 Pearson Addison-Wesley. All rights reserved
12-4
抽象类
• 集合可以通过不同的方法实现 • 数据结构就是抽象类 • 这就意味着它要隐藏一些不必要的细节 • 我们想要将接口的结构与它隐藏的实现相分离 • 这使得我们更好地管理复杂性,也使得不用改变接口而 这使得我们更好地管理复杂性, 改变实现成为可能
12-17
队列
我们可以定义队列的一些操作 入队-在队尾添加一个元素 入队 在队尾添加一个元素 出队-从队尾删除一个元素 出队 从队尾删除一个元素 清空-如果队是空的就返回 如果队是空的就返回ture 清空 如果队是空的就返回
• 就像链表一样,通过存储一般的对象引用,任何对象都 就像链表一样,通过存储一般的对象引用, 可以被存储在队列中 • 队列在进行模拟和当它的元素在等时进程的时候发生阻 塞时非常有用
树
• 树是一种有着一个根节点和一些叶子节点的非线性数据 结构, 结构,它的叶子节点形成分层结构 • 没有子节点的节点被称为叶子节点 • 除了根节点和叶子节点,其他的节点都被称为内节点 除了根节点和叶子节点, • 在一般的树里面,每一个节点都有很多子结点 在一般的树里面,
© 2004 Pearson Addison-Wesley. All rights reserved
第十二章
集合
集合
• 一个集合是一个对象,类似于保存其他对象的存储库 一个集合是一个对象, • 本章目标 本章目标:
探讨集合的概念 将接口与实现分离 动态的数据结构 链表 队列和堆栈 树和图 generics
© 2004 Pearson Addison-Wesley. All rights reserved
© 2004 Pearson Addison-Wesley. All rights reserved
12-6
大纲
集合与数据 动态表示 队列和堆栈 树和图 Java 集合 API
© 2004 Pearson Addison-Wesley. All rights reserved
12-7
动态结构
• 静态数据结构拥有固定的长度 • 这与静态静态变址数的意义不一样 • Array类是静态的,只要你定义了它能容纳元素的数目, 类是静态的,只要你定义了它能容纳元素的数目, 类是静态的 它的长度就不会改变 • 动态数据结构会在执行的时候根据它的内容进行增加或 减少 • 动态数据结构通常用链来实现
• 用一个带有分离的头结点的表,它在表的头和尾都拥有 用一个带有分离的头结点的表, 记数和引用, 记数和引用,这样可能会更方便
list
count: 4 front rear
© 2004 Pearson Addison-Wesley. All rights reserved
12-15
大纲
集合与数据结构 动态表示法 队列和堆栈 树和图 Java 集合类 API
12-2
大纲
集合和数据结构 动态的表示方法 队列和栈 树和图 Java 集合类 集合类API
© 2004 Pearson Addison-Wesley. All rights reserved
12-3
集合
• 一个集合是一个对象,类似于保存其他对象的存储库 一个集合是一个对象, • 一个对象提供增添、删减等管理所保存元素的服务 一个对象提供增添、 • 有时在一个集合类的元素是被命令的,有时却没有 有时在一个集合类的元素是被命令的, • 有些集合是同构的,这种集合保存类型全部相同的对象, 有些集合是同构的,这种集合保存类型全部相同的对象, 而有些集合则是异构的, 而有些集合则是异构的,即这种集合可以保存各种类型 的对象
Jane Jones 58821 3.72
© 2004 Pearson Addison-Wesley. All rights reserved
12-10
链式引用
• 链表可以用来去创造各种链式结构,例如链表: 链表可以用来去创造各种链式结构,例如链表:
studentList
© 2004 Pearson Addison-Wesley. All rights reserved
12-11
中间节点
• 被存储的对象不应该与存储它的数据结构的细节有任何 联系 • 例如:student类不应该在表中存储指向下一个 例如: 类不应该在表中存储指向下一个 student对象的链 对象的链 • 但是,我们可以使用一个有两个部分的单独节点类:1) 但是,我们可以使用一个有两个部分的单独节点类: ) 一个指向独立对象的引用2) 一个指向独立对象的引用 )在表中找一个指向下一节 点的链 • 内部的表示方法就成为了一个充满节点的链表
© 2004 Pearson Addison-Wesley. All rights reserved
12-24
大纲
集合与数据结构 动态表示法 队列与堆栈 树和图 Java 集合类 集合类API
© 2004 Pearson Addison-Wesley. All rights reserved
12-25
© 2004 Pearson Addison-Wesley. All rights reserved
12-23
堆栈
• java.util包包含了一个堆栈类 包包含了一个堆栈类 • 像ArrayList 操作一样 栈的操作都是在对象引用上 操作一样, 进行 • 参看 Decode.java (page 623)
12-26
图
• 图是非线性结构 • 与树和二叉树不同,图没有根节点 与树和二叉树不同, • 图中的任一节点都可与其他的任何节点用边连接起来 • 例如,在地图上高速公路连接了各个城市 例如,
© 2004 Pearson Addison-Wesley. All rights reserved
12-27
© 2004 Pearson Addison-Wesley. All rights reserved
12-9
链式引用
• 对象引用可以用来去创造对象之间的链 • 假设一个 假设一个student类包含了一个对另一个 类包含了一个对另一个student对象 类包含了一个对另一个 对象 的引用
John Smith 40725 3.57
enqueue
dequeue
© 2004 Pearson Addison-Wesley. All rights reserved
12-19
队列
• 一个队列可以用一个单独的链表表示;如果引用从队头 一个队列可以用一个单独的链表表示; 指向队尾, 指向队尾,此时效率最高 • 一个队列也可以用数组表示,对数组进行循环取余操作, 一个队列也可以用数组表示,对数组进行循环取余操作, 此时已经到达数组尾部而数组头部还有可用的空间
© 2004 Pearson Addison-Wesley. All rights reserved
12-28
有向图
• 在一个定向图或者有向图里,每一条边都有特定的方向 在一个定向图或者有向图里, • 有方向的弧有时称为弧 • 例如:飞机场之间的航线 例如:
© 2004 Pearson Addison-Wesley. All rights reserved
压入堆栈——将一个元素压入栈顶 将一个元素压入栈顶 压入堆栈 弹出 读栈顶——从栈顶获取元素,但并不将该元素移出栈顶 从栈顶获取元素, 读栈顶 从栈顶获取元素 检测空堆栈——如果堆栈为空,返回 如果堆栈为空, 检测空堆栈 如果堆栈为空 返回true
• 一个堆栈可以用一个单独的链表表示,不管引用是从头 一个堆栈可以用一个单独的链表表示, 指向尾还是从尾指向头都无关紧要 • 一个堆栈也可以用一个数组表示,但是它的新元素必需 一个堆栈也可以用一个数组表示, 放在数组可用的下一个位置, 放在数组可用的下一个位置,而不是放在尾部
© 2004 Pearson Addison-Wesley. All rights reserved
12-22
堆栈
• 一个堆栈的抽象数据类型也是线性的,就像表和队列 一个堆栈的抽象数据类型也是线性的, • 只能在栈顶插入、删除元素 只能在栈顶插入、 • 例如:在橱柜里的一堆盘子,一笔要付的帐或者是谷仓 例如:在橱柜里的一堆盘子, 里面一堆的干草
© 2004 Pearson Addison-Wesley. All rights reserved
12-5
抽象数据类型
• 一个抽象数据类型是由数据和在该数据上实施的具体操 作构成的集合 • 接口上实施的具体操作使它定义为抽闲数据类型 • 通常,只要抽象数据类型履行了对接口的承诺,就不必 通常,只要抽象数据类型履行了对接口的承诺, 在乎它是如何实现具体过程 • 对象拥有很好的编程机理去创造抽象数据类型,因为它 对象拥有很好的编程机理去创造抽象数据类型, 们内部的细节都是被包装的
© 2004 Pearson Addison-Wesley. All rights reserved
12-8
对象引用
• 回忆一下,一个对象引用就是一个存储对象地址的变量 回忆一下, • 一个引用也可以成为一个指针 • 引用经常用图来表示: 引用经常用图来表示:
student John Smith 40725 3.58
© 2004 Pearson Addison-Wesley. All rights reserved
12-20
堆栈
• 堆栈通常都被画成垂直的 堆栈通常都被画成垂直的:
push
pop
© 2004 Pearson Addison-Wesley. All rights reserved
12-21
堆栈
• 堆栈的基本操作 堆栈的基本操作:
© 2004 Pearson Addison-Wesley. All rights reserved
12-18
队列
• 队列与链表很相似,但是只能在队尾插入元素在队首删 队列与链表很相似, 除元素 • 它被称为 它被称为FIFO数据类型:先进先出 数据类型: 数据类型 • 例如:在银行出纳员窗口排队的人 例如:
© 2004 Pearson Addison-Wesley. All rights reserved
12-12
Magazine 集合
• 现在我们来举一个关于 现在我们来举一个关于Magzine对象集合的例子,它是 对象集合的例子, 对象集合的例子 类管理, 由Magzine类管理,而这个类拥有名为 类管理 而这个类拥有名为MagzineNode 的private类 类 • 因为 因为MagazineNode是对 是对MagazineNode是private 是对 是 所以MagazineList 的方法都可以直接进入 的,所以 MagazineNode,而不会违反封装条例 , • 参看 MagazineRack.java (page 615) • 参看 MagazineList.java (page 616) • 参看 Magazine.java (page 618)
© 2004 Pearson Addison-Wesley. All rights reserved
12-13
其他的动态表示法
• 用一个带有前和后引用的双向链表可能比实现表更方便
list
© 2004 Pearson Addison-Wesley. All rights reserved
12-14
其他的动态表示法