Java 之背包、队列和栈

夜深了,宿舍里,桌子上的杯子和勺子开始攀谈起来……

「杯子杯子,我看主人今天一直在忙着写程序啊!」勺子说道。

「是啊!这不主人找了个兼职工作——帮一家餐厅设计点餐程序嘛,当然会忙啦!」杯子答道。

「哇!没想到主人这么厉害呢,那餐厅一天一定有很多人点餐,怎么能保证店主可以按顺序处理顾客的订单呢?」勺子不解地问道

「哈哈!没想到你想的还挺多。的确,编写一个点餐程序确实需要处理很多顾客的数据,这就要求程序不仅要在顾客下订单的时候添加数据,还要能在订单处理完成后删除数据,重要的是所有顾客的订单数据必须要严格的按照时间先后来处理。不过,有一种叫『队列(Queue)』的数据类型刚好可以满足这种要求。」杯子回答。

「那什么是数据类型?」勺子精神了起来,忙追问道。

「数据类型就是一组数的集合以及可以对这组数进行的操作。由于在 Java 中,一切都可以抽象为对象,所以在 Java 中数据类型的值就是一组对象的集合,所有的操作都是关于添加、删除或者是访问集合中的对象」杯子回答。

「那你刚刚说的『队列』又是什么啊?」勺子问。

「从名字上就能看出来,队列就是一种基于先进先出策略的集合类型。即按照任务产生的顺序完成他们。这种数据类型人们每天都会遇到,它对每个对象都是公平的。这种数据类型给我们提供了如下的接口(API)」

-------------------------------------------------------
先进先出(FIFO)队列
-------------------------------------------------------
public class Queue implements Iterable
             Queue()               创建空队列
        void enqueue(Item item)    添加一个元素
        Item dequeue()             删除最早添加的元素
     boolean isEmpty()             队列是否为空
         int size()                队列中的元素数量
-------------------------------------------------------

「你看,通过这些方法是不是很容易就实现上面的需求啦!其实,队列不仅是很多日常现象的自然模型,它也是无数应用程序的核心是很重要的数据类型呢。」

勺子听了若有所思:「可是一个订单软件一定会有评价功能啊!如果评价功能也用队列来实现的话,那岂不是永远也看不到最新的评价啦。」

「想不到你思维还挺敏捷。没错,留言功能确实不适合用队列来实现,他需要一种基于后进先出(LIFO)策略的集合类型,它叫做『栈』。栈的 API 实现的功能与队列的 API 差不多。栈的用处还有很多,例如我们平时都会遇到的历史纪录,你想想,它是不是基于栈实现的?」

「我知道了,栈就相当于主人桌子上的文件。每当有新文件的时,主人就会把它放在最上边,当主人有空的时候就会一封一封的从上到下阅读他们。」

「看来你已经理解栈的含义了,其实还有一种有趣的数据类型叫做『背包』。你可以向背包里添加元素,但却不知道查看元素时的顺序。因为不知到查看的是哪一个元素,所以背包不能删除元素。就像主人喜欢收集玻璃球一样:他将收集的玻璃球放在一个袋子里,一次只放一个,但想找出特定的那个玻璃球的话,他能一个一个的翻找。」

「想不到还有这么奇怪的数据类型啊。」

「哈哈,背包主要用来存储那些处理顺序和结果无关的变量,比如说计算一个月收入的平均值等等。实现了这三种数据类型,程序猿们就可以对实际问题更好的抽象,它们都是程序猿解决问题的好帮手呢!」

你可能感兴趣的:(Java 之背包、队列和栈)