概念

背包是一种不支持从中删除元素的集合数据类型 —— 它的目的就是帮助用例收集元素并迭代遍历所有收集到的元素。所以使用 Bag 的 API,用 add 收集元素和用 foreach 遍历所有收集的元素 。

那么背包这种数据结构与堆栈、队列有何区别呢。若使用背包,那么说明元素处理的顺序不重要。所以背包的经典场景,就是收集数据后求平均值。

基于链表实现背包

用链表实现 Bag 只需将 Stack 中的 push() 改为 add(),并去掉 pop() 的实现即可。虽然正好也是后进先出的顺序,但顺序在这里并不重要。

public class Bag<Item> implements Iterable<Item> {
    private Node first;    // 链表的首结点

    private class Node{
        private Item item;
        private Node next;
    }

    public void add(Item item) {
        Node oldfirst = first;
        first = new Node();
        first.item = item;
        first.next = oldfirst;
    }

    public Iterator<Item> iterator()  {
        return new ListIterator();  
    }

    private class ListIterator implements Iterator<Item> {
        private Node current = first;

        public boolean hasNext()  { return current != null; }
        public void remove()      {  }

        public Item next() {
            Item item = current.item;
            current = current.next; 
            return item;
        }
    }

    public static void main(String[] args) {
        Bag<String> bag = new Bag<String>();
        while (!StdIn.isEmpty()) {
            String item = StdIn.readString();
            bag.add(item);   // 收集
        }
        for (String s : bag) {   // 遍历
            StdOut.println(s);
        }
    }
}

运行结果:

results matching ""

    No results matching ""