20162323周楠 2017-2018-1 《程序设计与数据结构》第五周、第六周学习总结
20162323周楠 2017-2018-1 《程序设计与数据结构》第五周、第六周学习总结
目录预览
0.教材学习内容总结
14.1 集合的介绍
- 集合是收集并组织其他对象的对象,它定义了访问及管理称为集合元素的其他对象的一种具体方式
- 集合中的元素一般由加入集合的次序或元素之间的某些固有的关系而组织。主要分为:线性的(集合中的元素排成一行)和非线性的(按不同于一行的方式来组织元素)。
- 集合中元素组织方式的决定因素:它们加入集合的次序;元素之间某些固有的关系。
一、抽象数据类型
- 集合也是一个抽象概念,一个集合定义了接口操作,通过这些接口,用户可以管理集合中的对象,用户通过接口与集合进行交互。
- 实现集合接口的类必须满足集合的定义
- 数据结构是用来实现集合的基本程序设计结构。
二、Java Collection API
- Java程序设计语言带有的类库,可用来开发软件,类库中包含应用程序接口(API)。
- Java Collection API表示的是使用不同方式实现的几类集合的一组类,对于每个集合,我们分析不同的实现方式,将它们与标准类库中使用的机制进行比较。
14.2栈集合
栈
- 栈是一个线性集合,其元素的添加与删除都在一端进行,栈的处理方式是后进后出(LIFO),最后进栈的元素最先移出栈。
- 程序员应该选择与所需管理的数据的类型相匹配的结构。
- 栈中的操作:
操作 | 描述 |
---|---|
push | 将元素添加到栈顶 |
pop | 删除栈顶元素 |
peek | 查看栈顶元素 |
isEmpty | 判定栈是否为空 |
size | 判定栈中元素的个数 |
14.3 继承、多态和泛型
- 多态引用使用对象的类型而不是引用的类型来判定要调用的方法是哪个。
一.泛型
- Java允许基于泛型来定义类
class Box<T>
{
//T类型对象的声明和操作代码
}
之后可以用具体的类来取代T,从而实例化它。还可以定义别的对象的Box
Box<Widget> box1 = new <Widget>;
Box<Gadget> box1 = new <Gadget>;
使用泛型,是一种安全的实现方式。
14.4 栈的ADT
- Java接口定义了一组抽象方法,能用来是来将抽象数据类型概念与它的实现分开。
- 通过使用接口名作为返回值类型,接口机制可让方法与实现栈的具体的类分开。
14.5 使用栈:计算后缀表达式
用栈来计算后缀表达式的算法可表述为:自左至右扫描表达式,依次识别每个符号(计算符、操作数)。如果是操作数,将它压入栈中,如果是运算符,则依次弹出栈顶的两个元素,执行相应的操作,将计算结果再压入栈中。当到达表达式的结尾时,栈中剩下的元素就是表达式的结果。想从栈中弹出两个元素而栈中没有两个元素,则后缀表达式是不正确的;到达表达式的结尾,但栈中还有1个以上的元素时,也表明表达式是不正确的。
14.6 异常
后缀表达式的潜在异常情况:
- 入栈时栈满
- 出栈时栈空
- 扫描完表达式时栈中的值多于1个
错误和异常代表不常见或不正确的处理
16.7 使用数组实现栈
要将集合和用来实现他的基本数据结构相分离,集合操作的实现细节不应该影响使用者与集合进行相互交互的方式。
1.管理容量
- 容量:数组中的单元个数
设计集合时,将新元素添加到已满的数据结构时要做什么
- 向集合中添加一个元素时,如果数据结构已满则抛出一个异常
- 实现add操作时,返回一个状态指示符,用来检查add操作是否成功
- 扩容
处理异常情形的方式,决定是集合还是集合的使用者来控制具体的行为
16.7 ArrayStack类
1.push操作
- 确保栈不满
- 数组count位置的引用指向要入栈的对象
- count值加1
2.pop操作
- 确保栈不满
- 计数器count减1
- 临时引用指向stack[count]
- stack [count]置为null
- 返回临时引用
3.peek、isEmpty、size和toString操作
14.9 将引用作为链
链式结构是适用对象引用变量来建立对象之间联系的一种数据结构,可用对象引用变量来创建链式结构
- 链表由对象组成,其中每个对象指向表中的下一个对象
链表根据需要动态变大,本质上没有容量限制
14.10 管理链表
1.访问元素
- 从第一个元素开始,从前向后沿表前进
2.插入结点
- 修改引用的次序对链表的维护很重要
一个结点可以插入到链表中的任何位置:在表头,在表的内部结点的中间,或在表尾,将一个结点加入到表头,需要重新设置指向整个表的引用。
如果新结点插入到表尾,则新结点的next引用要置为null;当新结点插入到表中的第一个位置时,则要当特殊情况处理。
3.删除结点
删除链表的第一个结点,需将指向表头的引用重置为指向表中当前的第2个结点。要删除表的中间结点,必须找到被删结点的前一个结点。
14.11 没有链的元素
保存在集合中的对象不能包含所用数据结构的任何实现细节
1.双向链表:
维护两个引用:一个指向表中的第1个结点,另一个指向表中的最后一个结点
2.使用链实现栈(LinkedStack类)
栈的链式实现方案在链表的一端添加或删除元素
1.push操作
- 创建一个新结点,其中包含一个指向要放置到栈中对象的引用
- 设置新结点的next引用指向当前的栈顶(为空null)
- 设置top引用指向新结点
- 栈中元素的个数count加1
2.pop操作
- 确保栈非空
- 设置临时引用指向栈顶元素
- 设置top引用指向栈顶结点的next引用
- 栈的元素个数count减一
- 返回临时引用指向的元素
15.1 队列ADT
1.队列
-
队列是一个线性集合,队列元素的处理方式是先进先出(FIFO),只允许在表的一端front进行插入,而在另一端rear进行删除
-
队头(front或head)、队尾(rear或tail),元素从队尾进,队头出
-
线性表的操作主要包括:
(1)清空队列
(2)判断是否为空
(3)元素的个数
(4)入队列
(5)出队列
(6)取对头元素 -
队列的操作
| 操作 | 描述 |
| -------- |:----------------😐
| enqueue | 将元素插入到队尾 |
| dequeue | 从表头删除元素 |
| first | 检查队头的元素 |
| isEmpty | 判定队列是否为空 |
| size | 判定队列中元素的个数 |
2.与栈进行比较
- 在栈中,只在集合的一端进行处理,在队列中,两端都有操作。
- 队列的操作与栈相似,没有提供操作允许用户进入到队列的中间位置,对其元素进行重排或删除。
15.2 使用队列
1.编码k值
- 对Caesar密码的改进:队列是保存重复编码K值的一种有效结构
2.模拟票务柜台
- 实现模拟时常用队列来表示等待的一列
- 解决实际问题时,达到最佳投入与收益
3.使用链表
- 与栈一样,可以使用LinearNode对象的链表实现队列,但必须在链表的两端进行操作,所以,除了有一个指向链表第一个元素的引用(front)之外,还要有一个引用(rear)指向表的最后一个元素,还需要一个整型变量count记录队列中的元素个数
- enqueue的时间复杂度是O(1)
- 入队操作:将新元素放到尾端(rear)。正常情况下,要将当前最后一个元素指向next引用指向新元素,并且rear引用重置为新的最后元素。但如果当前队列为空,front引用也必须指向新的(唯一的)元素
- 出队操作:如果队列中至少有一个元素,则返回链表中的首元素,然后修改front引用。当队列中只有一个元素时,如果删除最前面的元素后,队列为空,则rear引用必须置为null。front引用也要置为null。
队列的实现:使用数组
- 因为队列操作修改集合两端,所以将一端固定在下标为0的位置就会让元素移动。
- 非循环数组实现队列时元素的移动得到O(n)阶复杂度
- 采用数组实现队列时,把数组看成是一个环,可以避免移动元素