算法基础类
算法基础类介绍
Firstly -> Bag
Bag类就是一个存放东西的地方,形象起来就是一个存钱罐,可以往里面放东西,也可以瞥一眼里面有什么东西,不可以把东西从里面拿出来,除非destory它。
public interface Bag<T> extends Iterable<T>{ void add (T t); boolean isEmpty(); int size(); }
具体的实现有2种,一种用数组向下面这样子
插入对象的时候,从index为0的地方开始,一个一个插入数组, 比如插入一个100。还需要注意的一点是,当插入元素的大小超过了数组的大小的时候,需要重新new一个大些的数组,把元素一个一个的复制回去。
第二种实现就是使用Linked的方式,创建一个节点对象(Node 对象,通过对象的某个字段的来寻找到下一个对象)
刚开始只有一个Node, 这个Node是空的
当插入一个新的对象的时候,第2个对象中包含了第一个对象的引用,第二个对象能拿到第一个对象
接着再插入一个
Secondly -> Queue
queue就是一个通道其实,想象一下你洗漱后的水冲下下水道的那一瞬间,先进先去就是queue的特点。如下图
public interface Queue<T> extends Iterable<T>{ void enqueue(T t); T dequeue(); boolean isEmpty(); int size(); }
具体的实现其实和bag没什么区别,也是2种实现的方式。这里只讨论一下Linked的实现方式
假设现在有你有如下的数据
Dequeue()也就是把最新进去的那个对象给释放出来, 就变成了这样子
这个时候比如插入一个ForthNode,就会变成如下
所以,这是一个先进先出的一个队列模式
Thirdly -> Stack
stack先进后出,stack和queue是相反的。stack像是吃了的东西吐出来,而queue更像是吃了的拉出来。stack有很多用途,方法调用(递归)就是用stack来实现的。
public interface Stack<T> extends Iterable<T> {
void push(T t);
T pop();
boolean isEmpty();
int size();
}
具体的实现其实和bag没什么区别,也是2种实现的方式。这里只讨论一下array的实现方式。
假设你有如下的stack对象
现在要push一个D
现在要pop就会变成这样子
Are you Okay环节
那么在具体选择实现类的时候,选择哪一种比较好。linked的实现和array的实现的区别我感觉不是很大,大多是的时候你可以选择array的实现,array的实现内存使用较少。但是的resize的时候(就是元素个数大于数组的大小的时候需要resize)会花费额外的时间在把引用重新赋值上,数组数量多的话可能会对性能有影响。大多数情况下使用array就可以了。具体的代码实现 ->>>>>>>>>> https://github.com/Cheemion/algorithms/tree/master/src/com/algorithms/elementary