背包(Bag),队列(Queue),栈(Stack):
- 相同点:都是用来存储对象的集合。他们的操作都是关于添加,删除或者是访问集合中的对象。
- 不同点:他们对集合中对象的操作的顺序不同。
- 在背包中,集合中元素的处理顺序并不重要。
- 队列,是一种基于 先进先出策略 的集合数据类型。
- 栈,是一种基于 后进先出策略 的集合数据类型。
背包(Bag):
背包是一种不支持从中删除元素的集合数据类型。他存在的意义就是——帮助用例收集元素 并 迭代遍历所有收集到的元素。所以在背包中,元素迭代的顺序并不重要,只要能完整的遍历出来就可以了。
下面列出一个背包(泛型,可迭代)所具有的基础功能:
| 背包(bag) | |
public class Bag<Item> implements Iterable<Item> |
|
Bag() |
//使用构造方法创建一个空背包 |
void add(Item item) |
//在背包中添加一个元素 |
| boolean isEmpty() | //检查背包是否为空 |
| int size() | //背包中的元素数量 |
使用链表来实现背包(泛型,可迭代):
import java.util.Iterator; //使用链表实现背包(实现Iterable接口,完成迭代功能) public class Bag<Item> implements Iterable<Item>{ private Node first; //声明首结点 private int size = 0; //背包的元素数量 /* * 一个封装的内部类,定义结点的属性 * next为结点的指针域,指向下一个结点的位置 * data为结点的数据域,此结点要存储的数据存储在这里 */ class Node{ Node next; //指针域 Item data; //数据域 } /** * 1.先建立一个新的引用oldFirst使其指向首结点first * 2.开辟一块新的内存,将其声明为newFirst * 3.newFirst的指针域指向oldFirst,newFirst的数据域存储值data * 4.此时,这个链表的的第一个结点为newFirst,现在将首结点first指向newFirst所指向的空间。 * 5.size值加1,背包中元素的数量加1 * @param data 要存储的数据 */ public void add(Item data){ Node oldFirst = first; //旧的首结点 Node newFirst = new Node(); //新的首结点 newFirst.data = data; newFirst.next = oldFirst; first = newFirst; size++; //背包元素数量加1 } /** * 返回背包中元素的数量 * @return int类型,背包中元素的数量 */ public int size(){ return size; } /** * 返回boolean类型的值,如果背包为空,返回true * @return boolean类型 ,背包是否为空 */ public boolean isEmpty(){ return size == 0; } @Override public Iterator<Item> iterator() { // TODO Auto-generated method stub return new BagIterator<Item>(); } //内部类,实现Iterator接口 private class BagIterator<Item> implements Iterator<Item>{ private Node current = first; @Override public boolean hasNext() { // TODO Auto-generated method stub return current != null; } @Override public Item next() { // TODO Auto-generated method stub Item data = (Item) current.data; current = current.next; return data; } } }
背包的使用:
由于背包是一种无进出顺序的集合数据类型,所以他的使用场景也有着相应的限制,下面举一个简单的例子来说明:计算几个数字的平均数。
import java.util.Scanner; public class TestBag { public static void main(String[] args) { Bag<Integer> bag = new Bag<Integer>(); Scanner in = new Scanner(System.in); System.out.println("请输入5个int类型数字计算平均数:(数字之间用空格隔开)"); for (int i = 0; i < 5; i++) { bag.add(in.nextInt()); } double sum = 0; //使用迭代器遍历背包,累加 for(Integer i : bag){ sum += i; } System.out.println(sum/5); } }
在上面的例子中,数字的计算结果和数字的顺序并没有关系,你只需要使用声明一个背包对象,然后调用对象的add()方法往背包中添加元素,之后使用迭代器将背包中的元素遍历累加,然后除以5就可以得出结果了。虽然这个例子非常简单,但是他完美的体现出了背包的特性:背包中元素的处理顺序不重要。
2018-02-14 12:08:22
天行健,君子以自强不息;地势坤,君子以厚德载物。
浙公网安备 33010602011771号