JDK的deque接口
JDK1.6提供了双向队列的接口,它规定了一种双向队列的行为例如:头部插入/删除、尾部插入/删除。如果我们仅仅看deque接口的话(不看collection继承下来的方法),你会发现提供的方法都是基于头尾的。
这个特点可以直接用于实现栈与队列。
Deque接口继承自queue接口,特提供了更多指明方向的方法例如offerFirst、offerLast,如果仅使用Queue接口去接收一个实现类(如LinkedList),那么默认的先进先出就是尾插头删,而deque既然是双端队列接口,那么不论是头还是尾都可以实现先进先出的特点。
deque有四个常用实现类:
【1】linkedList,基于双向队列实现
【2】arrayDeque,基于循环数组实现
【3】concurrentLinkedDeque,线程安全,非阻塞
【4】linkedBlockingDeque,线程安全,空队列获取元素时阻塞
实现循环双端队列
力扣地址
我们要设计一个循环的双端队列,有以下特点:
【1】满了就不能再插入了。(不是无限插入的,有上限值)
【2】空了不能够获得。
(上面直接return false,如果放在阻塞队列则应该被阻塞直到队列不满或不空)
基于双向链表实现
其实本题更适合使用循环数组实现,双向链表实现比较简单,就是常规的双向链表,并且通过首尾指针进行一些查询、删除、插入操作。(注意:本题的容量是限定死的,不是无限插入的)
class Node{
Node pre;
Node next;
int val;
public Node(int val) {
this.val = val;
}
}
如果使用链表实现,其实问题退化为了设计链表,并实现一些头插尾插的方法,都是O(1),但是需要额外维护链表的成员头结点和尾结点。
int size;
int cap;
Node head;
Node tail;
public MyCircularDeque(int k) {
cap=k;
head=new Node(-1);
tail=new Node(-1);
head.next=tail;
tail.pre=head;
}
public boolean insertFront(int value) {
if(isFull())retu