API
每份API都含有
一个无参数的构造函数,
一个向集合中添加单个元素的防范,
一个测试集合是否为空的方法
一个返回集合大小的方法。
另Stack和Queue都含有一个能够删除集合中特定元素的方法。
两种java特性:范型,迭代。
泛型:集合类的抽象数据类型的一个关键特征是我们应该可以用他们储存任意类型的数据,java机制能够做到这一点,它被称为泛型,也叫做参数化类型。
自动拆箱:自动将一个原始数据类型转换为一个封装类型。
自动拆箱:自动将一个封装类型转换为一个原始数据类型。
迭代(模式):对于许多场景,用例的要求只是用某种方式处理集合中的每个元素,或者叫迭代访问集合中的所。
例:用foreach打印Queue中的交易列表:
Queue<Transaction> collection = new Queue<Transaction>();
for(Transaction t:collection){
System.out.println(t);
}
foreach语句:可以将for语句看作对于集合中的每个交易t,执行以上代码段。
这段用例代码不需要知道集合的表示或实现的任何细节,它只想逐个处理集合众的元素。
背包
背包是一种不支持从中删除元素的集合数据类型——它的目的就是帮助用例收集元素并迭代遍历所有收集到的元素(用例也可以检查背包是否为空或者获取背包中元素的数量),迭代顺序不确定且与用例无关。
要理解背包的概念,可以想象一个非常喜欢收集子弹球的人。他将所有子弹球都放在一个背包里,一次一个,并且会不时在所有子弹球中找一颗拥有某种特点的子弹球。
使用BAG可以说明元素的处理顺序不重要。
背包的典型用例:简单计算标准输入中的所有double值的平均值和样本标准差。如果标准输入中有N个数字,那么平均值为他们和的除以N,样本标准差为每个值和平均值的平方和除以N-1之后的平方根。在这些计算中,数的计算顺序和结果无关。
//典型的背包用例
public class stats
{
public static void main(String[] args)
{
Bag<Double> numbers = new Bag<Double>();
while(!StdIn.isEmpty())
numbers.add(StdIn.readDouble());
int N = numbers.size();
double sum = 0.0;
for(double x : numbers)
sum += x;
double mean = sum/N;
sum = 0.0;
for(double x : numbers)
sum += (x-mean)*(x-mean)l
double std = Math.sqrt(sum/(N-1));
StdOut.printf("Mean:%.2\n",mean);
StdOut.printf("Std dev:%.2\n",std);
}
}
队列
先进先出队列
先进先出队列(队列):是一种基于先进先出(FIFO)策略的合集.
在应用程序中使用队列的主要原因是在用合集保存元素的同时保存他们的相对顺序:使它们入列和出列顺序相同。
一个典型的先进先出队列:先将所有整数读入队列中,然后使用Queue的size()方法得到所需数组的大小,创建数组并将队列中所有整数移动到数组中。
下压栈
下压栈(栈):先进后出队列(LIFO)
Stack用例:把标准输入中的所有整数逆序排列,同样无需知道整数数量。
链表
定义:链表是一种递归的数据结构,它或者为空null,或是指向另一个结点(node)的引用,该结点含有一个泛型的元素和一个指向另一条链表的引用。
结点可能是一个含有任意型数据的抽象实体,它所包含的指向结点的应用显示了它在构造链表之中的作用。
首先:用一个嵌套类定义结点的抽象数据类型:
private class Node
{
Item item;
Node next;
}
构造链表
从表头插入节点/删除节点
链表结尾插入新节点
用链表实现下压堆栈
用链表实现先进先出队列
链表实现背包
加粗部分的代码可以通过遍历链表使Stack, Queue,Bag变为可迭代的。
Stack:链表访问顺序后进先出。
Queue:链表访问顺序先进先出。
Bag:链表访问顺序后进先出,但顺序不重要。