• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
北晨NHS
博客园    首页    新随笔    联系   管理    订阅  订阅
背包,队列,栈的学习(1)背包

背包(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


天行健,君子以自强不息;地势坤,君子以厚德载物。

 

posted on 2018-02-14 12:06  北晨NHS  阅读(165)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3