栈和队列属于一维数据结构中的高级结构。栈(Stack)与队列(Queue)的区别在于
栈是后进先出,也就是LIFO(Last in, First out)
而队列是先进先出,也就是FIFO(First in, First out)。
栈结构就好像装子弹,后填充的子弹先被打出去。
队列就好比我们生活中的排队买票,先到先得。
Stack
java Stack 成员方法:
其中,pop和peek方法,当Stack为空的时候会抛出EmptyStackException异常
当调用search方法,找不到需要的元素的时候,返回-1
Queue
java Queue 成员方法:
它分别提供了两种增,删,查。他们之间的区别是:
当队列为空的时候调用element,remove方法会抛出异常,调用peek,poll会返回null
当队列已满的时候嗲用add方法会抛出IllegalStateException异常,而调用offer方法会返回false
参考链接: developer.classpath.org/doc/java/ut…
了解了基本操作,我们看一下两个简单的实战例题:
Deque
小试牛刀后,我们再来看一下双端队列Deque,这个就厉害了,见名知意,既有栈的特性,又包含队列的特性,想怎么进怎么出都可以。
注意:
Java堆栈Stack类已经过时,Java官方推荐使用Deque替代Stack使用。
所以我们做题的时候可以直接使用Deque
Deque是一个双端队列接口,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。它有addFirst,addLast等方法
详细的官方文档: fuseyism.com/classpath/d…
PriorityQueue
还有一种高级的队列叫做优先级队列PriorityQueue
现实生活中就好比vip通道,军人优先等
我们先了解下它的概念:
我们都知道队列,队列的核心思想就是先进先出,这个优先级队列有点不太一样。优先级队列中,数据按关键词有序排列,插入新数据的时候,会自动插入到合适的位置保证队列有序。(顺序有两种形式:升序或者是降序)
标准定义:
PriorityQueue类在Java1.5中引入。PriorityQueue是基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器)在队列实例化的时排序。要求使用Java Comparable和Comparator接口给对象排序,并且在排序时会按照优先级处理其中的元素。
实现原理:
Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示(任意一个非叶子节点的权值,都不大于其左右子节点的权值),也就意味着可以通过数组来作为PriorityQueue的底层实现。
鉴于目前对于堆和树的概念还不是很了解,对于PriorityQueue操作也不是很熟悉,后面学习了相关的知识,再结合实际例题再重新回顾,这里先有个印象。