背包的定义
背包主要是用来存储元素的容器,只支持添加操作,不支持删除操作。
背包的主要作用为统计元素的性质以及遍历元素。背包API
Bag() 创建一个空背包
void add (Item item) 添加一个元素
boolean isEmpty() 背包是否为空
int size() 背包的容量背包的实现
使用单链表实现,并支持迭代查询
package xwq.dt;
import java.util.Iterator;
import java.util.NoSuchElementException;
import xwq.util.StdIn;
import xwq.util.StdOut;
/*
* Compilation: javac Bag.java
* Execution: java Bag < input.txt
* Dependencies: StdIn.java StdOut.java
* 使用单向链表实现的背包
* 背包用于防止元素,可用于统计等工作
*/
public class Bag<Item> implements Iterable<Item> {
//背包头指针
private Node<Item> first;
//背包容量
private int N;
private static class Node<Item> {
private Item item;
private Node<Item> next;
}
/**
* 默认构造函数
*/
public Bag() {
first = null;
N = 0;
}
/**
* 判断背包是否为空
* @return 为空返回true,不为空返回false
*/
public boolean isEmpty() {
return first != null;
}
/**
* 背包内容量
* @return 背包容量
*/
public int size() {
return N;
}
/**
* 向背包中添加元素
* @param item 待添加元素
*/
public void add(Item item) {
Node<Item> node = new Node<Item>();
node.item = item;
node.next = this.first;
this.first = node;
N++;
}
@Override
public Iterator<Item> iterator() {
return new ListIterator<Item>(first);
}
//一个迭代器,没有实现remove方法
private class ListIterator<Item> implements Iterator<Item> {
private Node<Item> current;
public ListIterator(Node<Item > first) {
this.current = first;
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
if(current != null)
return true;
return false;
}
@Override
public Item next() {
// TODO Auto-generated method stub
//背包为空,抛异常
if(!hasNext())
throw new NoSuchElementException();
Item item = current.item;
current = current.next;
return item;
}
@Override
public void remove() {
// TODO 背包不支持删除操作
throw new UnsupportedOperationException();
}
}
public static void main(String[] args) {
Bag<String> bag = new Bag<String>();
while(!StdIn.isEmpty()) {
String item = StdIn.readString();
bag.add(item);
}
StdOut.println("背包的容量为:"+bag.size());
for(String item : bag) {
StdOut.println(item);
}
}
}