Queue、 Deque接口
(一)、Queue
- 队列(Queue)是一种特殊的线性表,是一种先进先出(FIFO)的数据结构。它只允许在 表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作 的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
- LinkedList是Queue接口的实现类
public class LinkedList<E>extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable
// 注意Deque 已经实现Queue接口
实现一个队列(queue), 并使用相应的操作
- boolean add() :将指定的元素插入此队列(如果立即可行且不会违反容量限制),在 成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。
- element() :获取,但是不移除此队列的头。
- boolean offer() :将指定的元素插入此队列(如果立即可行且不会违反容量限制), 当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而 只是抛出一个异常。
- peek() :获取但不移除此队列的头;如果此队列为空,则返回 null。 E poll() :获取并移除此队列的头,如果此队列为空,则返回 null。
- remove() :获取并移除此队列的头。
// 创建一个队列
Queue<String> queue = new LinkedList<>();
// 向队列中添加数据
// 方法1 add()
queue.add("张三");
queue.add("李四");
queue.add("王五");
// 方法2 offer()
queue.offer("赵六");
queue.forEach( v -> System.out.print(v + ", "));
// 张三, 李四, 王五, 赵六,
System.out.println("\n--------------element()");
// 获取数据
// 方法1 element() 但不会移除队列头
String value = queue.element();
System.out.println(value);
/**
--------------element()
张三
*/
// 方法2 peek() 不会移除队列头, 如果队列为空, 返回null
System.out.println("------------peek()");
value = queue.peek();
System.out.println(value);
/**
------------peek()
张三
*/
System.out.println("------------poll()");
// 方法3 poll() 获取并移除队列头, 如果队列为空, 返回null
value = queue.poll();
System.out.println(value);
queue.forEach( v -> System.out.print(v + ", "));
/**
------------poll()
张三
李四, 王五, 赵六,
*/
System.out.println("\n-------------remove()");
// 方法4 remove() 获取并移除此队列的头
value = queue.remove();
System.out.println(value);
queue.forEach( v -> System.out.print(v + ", "));
/**
-------------remove()
李四
王五, 赵六,
*/
(二)、Deque
- 一个线性 collection,支持在两端插入和移除元素。 此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。-
- 与Queue 使用差不多,只不过它是双向的
- 实现一个双向队列, 及其操作
// 创建一个双向队列
Deque<String> deque = new LinkedList<>();
// 向队列头部中添加数据, 或者 addFirst()
deque.add("张三");
deque.add("李四");
deque.add("王五");
// 向队列尾部添加数据
deque.addLast("王二麻子");
deque.addLast("小雪");
System.out.println(deque.toString());
/**
[张三, 李四, 王五, 王二麻子, 小雪]
*/
// 获取数据
System.out.println("-----------获取数据");
// 1. 从队列头获取数据, 但移除
System.out.println(deque.getFirst());
// 2. 从队列尾部获取数据, 但移除
System.out.println(deque.getLast());
System.out.println(deque.toString());
/**
-----------获取数据
张三
小雪
[张三, 李四, 王五, 王二麻子, 小雪]
*/
System.out.println("-----------获取数据并移除队列");
System.out.println(deque.toString());
// pollFirst(), 从头部获取并移除
String value = deque.pollFirst();
System.out.println("头部:"+value);
// pollLast() 从尾部获取数据并移除
value = deque.pollLast();
System.out.println("尾部:" + value);
System.out.println(deque.toString());
/**
-----------获取数据并移除队列
[张三, 李四, 王五, 王二麻子, 小雪]
头部:张三
尾部:小雪
[李四, 王五, 王二麻子]
*/