小酌Deque

刷力扣239的时候,发现使用一个数据结构Deque会让实现很简单。于是看源码学习一下。Deque继承Queue,但是包含更多方法。

Deque

Deque就是doulbe end queue,就是两端都可以操作的队列。

public interface Deque<E> extends Queue<E> {
void addFirst(E e);
void addLast(E e);
boolean offerFirst(E e);
......
}

ArrayDeque

让我们来看一下具体实现类ArrayDeque,可以看到,底层是用一个数组elements来实现的。先看几个Queue经典操作。

public class ArrayDeque<E> extends AbstractCollection<E>
                           implements Deque<E>, Cloneable, Serializable
{
transient Object[] elements;

public void addFirst(E e) {
        if (e == null)
            throw new NullPointerException();
        elements[head = (head - 1) & (elements.length - 1)] = e;
        if (head == tail)
            doubleCapacity();
    }

public void addLast(E e) {
        if (e == null)
            throw new NullPointerException();
        elements[tail] = e;
        if ( (tail = (tail + 1) & (elements.length - 1)) == head)
            doubleCapacity();
    }
    Queue
public boolean offer(E e) {
        return offerLast(e);
    }
public E poll() {
        return pollFirst();
    }

public E peek() {
        return peekFirst();
    }
///Stack
 public void push(E e) {
        addFirst(e);
    }
public E pop() {
        return removeFirst();
    }

addFirst()

我们可以从这个方法得知这个数组是怎么储存数据的。
elements[head = (head - 1) & (elements.length - 1)] = e;长度只能是2的指数倍,所以elements.length - 1,就是低位都是1,比如长度为16,那么为01111(就相当于取模操作,主要为了解决负数-1). head刚进来初始化为0,0-1=-1,二进制为11111,&操作后为01111=15,所以第一个数被存在下标为15的地方也就是数组的尾巴,下一个add的数将会被存在(15-1)&(01111)=14,所以是倒着存的。以此类推。

这相当于是一个循环数组

addLast()

同理现在再看addLast()就很简单了,tail = (tail + 1) & (elements.length - 1),从前往后加对象。

相当于队列的操作

  1. poll() 可以看到调用了pollFirst(),顾名思义,就是把queue中第一个元素给poll了,那么肯定有pollLast(),poll掉最后一个元素。first是数组下标为0,last是数组下标为size的。
  2. peek()调用了peekFirst(),同理还可以使用peekLast()
  3. offer()调用了offerLast(),就是往数组尾巴上加入元素。

相当于stack的操作

  1. push()
  2. peek()
  3. pop()
Java中的Deque是一种双端队列,它可以在两端进行插入和删除操作。Deque是"Double Ended Queue"的缩写。在Java中,Deque接口是Queue接口的子接口,它扩展了Queue接口,提供了更多的方法来支持双端操作。 可以使用Java的LinkedList类来实现Deque接口。下面是一个使用Deque的简单示例: ```java import java.util.Deque; import java.util.LinkedList; public class DequeExample { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); // 在队尾添加元素 deque.addLast("element1"); deque.offerLast("element2"); deque.offer("element3"); // offer方法等同于offerLast // 在队头添加元素 deque.addFirst("element4"); deque.offerFirst("element5"); System.out.println("Deque: " + deque); // 获取并移除队尾元素 String lastElement = deque.removeLast(); System.out.println("Removed last element: " + lastElement); // 获取并移除队头元素 String firstElement = deque.removeFirst(); System.out.println("Removed first element: " + firstElement); System.out.println("Updated Deque: " + deque); } } ``` 输出结果: ``` Deque: [element5, element4, element1, element2, element3] Removed last element: element3 Removed first element: element5 Updated Deque: [element4, element1, element2] ``` 在上面的示例中,我们使用了Deque的常用方法,如addFirst、addLast、offerFirst、offerLast、removeFirst和removeLast等。 希望这个示例对你有帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值