背包、队列和栈
- 什么是背包?队列?栈?
- 使用它们的目的?什么时候使用它们?
- 怎么实现它们?(一些问题及其优化方案)
- 链表的性能特点
- 为什么不使用Java内置的栈和队列?
- 拓展(坚持使用窄接口)
1、什么是背包?队列?栈?
它们是三种不同的数据类型。
①、背包:一种不支持从中删除元素的集合数据类型
②、队列(又称“先进先出队列”):一种基于先进先出(FIFO)策略的集合数据类型
③、栈(又称“下压栈”):一种基于后进先出(LIFO)策略的集合数据类型
2、使用它们的目的?什么时候使用它们?
①、背包:目的就是帮助用例收集元素并迭代遍历所有收集到的元素;当元素的处理顺序不重要(即:数的计算顺序和结果无关)时,使用背包。
②、队列:在用集合元素保存元素的同时保存它们的相对顺序,使它们入列的顺序和出列的顺序相同;即当元素的处理顺序和它们被添加到队列中的顺序相同时,使用队列。
③、栈:在用集合保存元素的同时颠倒它们的相对顺序,使它们入列的顺序和出列的顺序相反;即当元素的处理顺序和它们被添加到队列中的顺序正好相反时,使用栈。
3、怎么实现它们?(一些问题及其优化方案)
①、背包
链表实现
import java.util.Iterator;
/**
* 背包的链表实现
*
* @author TinyDolphin
* 2017/5/8 20:40.
*/
public class Bag<Item> implements Iterable<Item> {
//私有嵌套类:只有含有它的类能够直接访问它的实例变量。非静态的嵌套类也被称为内部类
private class Node {
Item item;
Node next;
}
private Node first; //链表的首结点
private int N = 0;
public boolean isEmpty() {
return N == 0; //或first==null
}
private int size() {
return N;
}
/**
* 和Stack的push()方法完全相同
*
* @param item 要插入的值
*/
public void add(Item item) {
Node oldFirst = first;
first = new Node();
first.item = item;
first.next = oldFirst;
N++;
}
@Override
public Iterator<Item> iterator() {