目录
- 一、Queue
- 1、什么是队列(Queue)
- 2、方法
- 3、代码实现
- 4、运行结果
- 二、Deque
- 1、什么是双端队列(Deque)
- 2、方法
- 3、代码实现
- 4、运行结果
一、Queue
1、什么是队列(Queue)
- 队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
- LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
2、方法
- offer,add 区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。
- poll,remove 区别:
remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
- peek,element区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。
3、代码实现
import java.util.LinkedList;
import java.util.Queue;
/**
* @author :浪漫不死
* @version: 1.0
* @description:队列
* @date : 2020/11/13 16:15
*/
//poll() 检索并移除此队列的头,或返回 null如果队列为空。
//remove() 检索和删除此队列的头。
//element() 检索,但不删除此队列的头。
//offer(E e)如果可能立即在不违反容量限制的情况下这样做的话,将指定的元素插入到队列中。
//peek() 检索,但不删除,这个队列头,或返回 null如果队列为空。
public class QueueDemo {
public static void main(String[] args) {
//add()和remove()方法在失败的时候会抛出异常(不推荐)
Queue<String> queue = new LinkedList<String>();
//添加元素
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("d");
queue.offer("e");
for(String q : queue){
System.out.println(q);
}
System.out.println("=======");
System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除
for(String q : queue){
System.out.println(q);
}
System.out.println("=======");
System.out.println("element="+queue.element()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
System.out.println("=======");
System.out.println("peek="+queue.peek()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
}
}
4、运行结果
二、Deque
1、什么是双端队列(Deque)
- 名称 Deque 是double ended queue(双端队列) 的缩写。
- 是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
- 大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
2、方法
此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。因为此接口继承了队列接口Queue,所以其每种方法也存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。
此接口扩展了 Queue 接口。在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从Queue 接口继承的方法完全等效于 Deque 方法,如下表所示:
双端队列也可用作 LIFO(后进先出)堆栈。应优先使用此接口而不是遗留 Stack 类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。堆栈方法完全等效于Deque 方法,如下表所示:
注意,在将双端队列用作队列或堆栈时,peek 方法同样正常工作;无论哪种情况下,都从双端队列的开头抽取元素。
此接口提供了两种移除内部元素的方法:removeFirstOccurrence 和 removeLastOccurrence。
与 List 接口不同,此接口不支持通过索引访问元素。
虽然 Deque 实现没有严格要求禁止插入 null 元素,但建议最好这样做。建议任何事实上允许 null 元素的 Deque 实现用户最好不 要利用插入 null 的功能。这是因为各种方法会将null 用作特殊的返回值来指示双端队列为空。
Deque 实现通常不定义基于元素的 equals 和 hashCode 方法,而是从 Object 类继承基于身份的equals 和 hashCode 方法。
3、代码实现
import java.util.Deque;
import java.util.LinkedList;
/**
* @author :浪漫不死
* @version: 1.0
* @description: 双端队列
* @date : 2020/11/13 16:29
*/
public class DequeDemo {
public static void main(String[] args) {
Deque<Integer> deque = new LinkedList<>();
deque.addFirst(1);
deque.addFirst(2);
deque.addFirst(3);
deque.addFirst(4);
deque.addLast(5);
deque.addLast(6);
deque.addLast(7);
while (!deque.isEmpty()) {
if(!deque.isEmpty()) {
System.out.println(deque.getFirst());
}
if(!deque.isEmpty()) {
System.out.println(deque.removeFirst());
}
if(!deque.isEmpty()) {
System.out.println(deque.getLast());
}
if(!deque.isEmpty()) {
System.out.println(deque.removeLast());
}
}
}
}
4、运行结果