设计:循环双端队列

本文探讨了JDK的deque接口及其四个实现类,并详细介绍了如何基于双向链表和循环数组实现循环双端队列,重点分析了循环数组实现的优势和操作规则,包括哨兵位的作用以及满和空状态的判断。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值