Java 数据结构之Deque(双端队列)

来源:互联网 发布:阿姆斯特朗 外星人知乎 编辑:程序博客网 时间:2024/06/04 18:19

Deque接口是“double ended queue”的缩写(通常读作“deck”),即双端队列,支持在队列的两端插入和删除元素,继承Queue接口。大多数的实现对元素的数量没有限制,但这个接口既支持有容量限制的deque,也支持没有固定大小限制的。

Deque接口定义了在两端访问元素的方法,主要包括insert、remove和examine。和Queue定义一样,所有这些方法存在两种形式:一种如果操作失败则抛出异常,另一种则返回一个特殊值(null或false)。后者主要是为有容量限制的队列实现的。

Deque的12种方法总结如下:

Summary of Deque methods First Element (Head)Last Element (Tail) Throws exceptionSpecial valueThrows exceptionSpecial valueInsertaddFirst(e)offerFirst(e)addLast(e)offerLast(e)RemoveremoveFirst()pollFirst()removeLast()pollLast()ExaminegetFirst()peekFirst()getLast()peekLast()

当deque用作queue时,则表现出FIFO的行为,元素从队尾加入,在队首移除,从Queue接口继承来的方法和Deque中的一些方法等同。如下表:

Comparison of Queue and Deque methods{@code Queue} MethodEquivalent {@code Deque} Method{@link java.util.Queue#add add(e)}{@link #addLast addLast(e)}{@link java.util.Queue#offer offer(e)}{@link #offerLast offerLast(e)}{@link java.util.Queue#remove remove()}{@link #removeFirst removeFirst()}{@link java.util.Queue#poll poll()}{@link #pollFirst pollFirst()}{@link java.util.Queue#element element()}{@link #getFirst getFirst()}{@link java.util.Queue#peek peek()}{@link #peek peekFirst()}

Deque也可以被用作LIFO的栈,此时的接口应该严格参照Stack类的实现。当deque被用作栈时,元素在deque的head端push/pop。栈的方法等价于Deque中的一些方法,如下表:

Comparison of Stack and Deque methodsStack MethodEquivalent {@code Deque} Method  push(e)                    addFirst(e)  pop()  removeFirst()  peek()peekFirst()
注意:peek方法在Deque用作队列和栈时是没问题的,这两种情况都是在deque的head端获得。

Deque接口提供了两种方法来移除内部的元素,removeFirstOccurrence 和 removeLastOccurrence。

Deque与List不同,该接口不支持下标访问元素。Deque的实现并不严格要求禁止插入元素null,但强烈鼓励不插入null。任何Deque的实现都强烈鼓励不要插入null,因为null是多种方法作为一种特殊返回值来表示deque为空。

和Queue一样,Deque的实现通常不定义基于元素的equals和hashCode方法,而是直接继承自Object类。

Deque接口源码:

public interface Deque<E> extends Queue<E> {    /**     * Inserts the specified element at the front of this deque if it is     * possible to do so immediately without violating capacity restrictions,     * throwing an {@code IllegalStateException} if no space is currently     * available.  When using a capacity-restricted deque, it is generally     * preferable to use method {@link #offerFirst}.     *     * @param e the element to add     * @throws IllegalStateException if the element cannot be added at this     *         time due to capacity restrictions     * @throws ClassCastException if the class of the specified element     *         prevents it from being added to this deque     * @throws NullPointerException if the specified element is null and this     *         deque does not permit null elements     * @throws IllegalArgumentException if some property of the specified     *         element prevents it from being added to this deque     */    void addFirst(E e);    /**     * Inserts the specified element at the end of this deque if it is     * possible to do so immediately without violating capacity restrictions,     * throwing an {@code IllegalStateException} if no space is currently     * available.  When using a capacity-restricted deque, it is generally     * preferable to use method {@link #offerLast}.     *     * <p>This method is equivalent to {@link #add}.     *     * @param e the element to add     * @throws IllegalStateException if the element cannot be added at this     *         time due to capacity restrictions     * @throws ClassCastException if the class of the specified element     *         prevents it from being added to this deque     * @throws NullPointerException if the specified element is null and this     *         deque does not permit null elements     * @throws IllegalArgumentException if some property of the specified     *         element prevents it from being added to this deque     */    void addLast(E e);    /**     * Inserts the specified element at the front of this deque unless it would     * violate capacity restrictions.  When using a capacity-restricted deque,     * this method is generally preferable to the {@link #addFirst} method,     * which can fail to insert an element only by throwing an exception.     *     * @param e the element to add     * @return {@code true} if the element was added to this deque, else     *         {@code false}     * @throws ClassCastException if the class of the specified element     *         prevents it from being added to this deque     * @throws NullPointerException if the specified element is null and this     *         deque does not permit null elements     * @throws IllegalArgumentException if some property of the specified     *         element prevents it from being added to this deque     */    boolean offerFirst(E e);    /**     * Inserts the specified element at the end of this deque unless it would     * violate capacity restrictions.  When using a capacity-restricted deque,     * this method is generally preferable to the {@link #addLast} method,     * which can fail to insert an element only by throwing an exception.     *     * @param e the element to add     * @return {@code true} if the element was added to this deque, else     *         {@code false}     * @throws ClassCastException if the class of the specified element     *         prevents it from being added to this deque     * @throws NullPointerException if the specified element is null and this     *         deque does not permit null elements     * @throws IllegalArgumentException if some property of the specified     *         element prevents it from being added to this deque     */    boolean offerLast(E e);    /**     * Retrieves and removes the first element of this deque.  This method     * differs from {@link #pollFirst pollFirst} only in that it throws an     * exception if this deque is empty.     *     * @return the head of this deque     * @throws NoSuchElementException if this deque is empty     */    E removeFirst();    /**     * Retrieves and removes the last element of this deque.  This method     * differs from {@link #pollLast pollLast} only in that it throws an     * exception if this deque is empty.     *     * @return the tail of this deque     * @throws NoSuchElementException if this deque is empty     */    E removeLast();    /**     * Retrieves and removes the first element of this deque,     * or returns {@code null} if this deque is empty.     *     * @return the head of this deque, or {@code null} if this deque is empty     */    E pollFirst();    /**     * Retrieves and removes the last element of this deque,     * or returns {@code null} if this deque is empty.     *     * @return the tail of this deque, or {@code null} if this deque is empty     */    E pollLast();    /**     * Retrieves, but does not remove, the first element of this deque.     *     * This method differs from {@link #peekFirst peekFirst} only in that it     * throws an exception if this deque is empty.     *     * @return the head of this deque     * @throws NoSuchElementException if this deque is empty     */    E getFirst();    /**     * Retrieves, but does not remove, the last element of this deque.     * This method differs from {@link #peekLast peekLast} only in that it     * throws an exception if this deque is empty.     *     * @return the tail of this deque     * @throws NoSuchElementException if this deque is empty     */    E getLast();    /**     * Retrieves, but does not remove, the first element of this deque,     * or returns {@code null} if this deque is empty.     *     * @return the head of this deque, or {@code null} if this deque is empty     */    E peekFirst();    /**     * Retrieves, but does not remove, the last element of this deque,     * or returns {@code null} if this deque is empty.     *     * @return the tail of this deque, or {@code null} if this deque is empty     */    E peekLast();    /**     * Removes the first occurrence of the specified element from this deque.     * If the deque does not contain the element, it is unchanged.     * More formally, removes the first element {@code e} such that     * <tt>(o==null ? e==null : o.equals(e))</tt>     * (if such an element exists).     * Returns {@code true} if this deque contained the specified element     * (or equivalently, if this deque changed as a result of the call).     *     * @param o element to be removed from this deque, if present     * @return {@code true} if an element was removed as a result of this call     * @throws ClassCastException if the class of the specified element     *         is incompatible with this deque     * (<a href="Collection.html#optional-restrictions">optional</a>)     * @throws NullPointerException if the specified element is null and this     *         deque does not permit null elements     * (<a href="Collection.html#optional-restrictions">optional</a>)     */    boolean removeFirstOccurrence(Object o);    /**     * Removes the last occurrence of the specified element from this deque.     * If the deque does not contain the element, it is unchanged.     * More formally, removes the last element {@code e} such that     * <tt>(o==null ? e==null : o.equals(e))</tt>     * (if such an element exists).     * Returns {@code true} if this deque contained the specified element     * (or equivalently, if this deque changed as a result of the call).     *     * @param o element to be removed from this deque, if present     * @return {@code true} if an element was removed as a result of this call     * @throws ClassCastException if the class of the specified element     *         is incompatible with this deque     * (<a href="Collection.html#optional-restrictions">optional</a>)     * @throws NullPointerException if the specified element is null and this     *         deque does not permit null elements     * (<a href="Collection.html#optional-restrictions">optional</a>)     */    boolean removeLastOccurrence(Object o);    // *** Queue methods ***    /**     * Inserts the specified element into the queue represented by this deque     * (in other words, at the tail of this deque) if it is possible to do so     * immediately without violating capacity restrictions, returning     * {@code true} upon success and throwing an     * {@code IllegalStateException} if no space is currently available.     * When using a capacity-restricted deque, it is generally preferable to     * use {@link #offer(Object) offer}.     *     * <p>This method is equivalent to {@link #addLast}.     *     * @param e the element to add     * @return {@code true} (as specified by {@link Collection#add})     * @throws IllegalStateException if the element cannot be added at this     *         time due to capacity restrictions     * @throws ClassCastException if the class of the specified element     *         prevents it from being added to this deque     * @throws NullPointerException if the specified element is null and this     *         deque does not permit null elements     * @throws IllegalArgumentException if some property of the specified     *         element prevents it from being added to this deque     */    boolean add(E e);    /**     * Inserts the specified element into the queue represented by this deque     * (in other words, at the tail of this deque) if it is possible to do so     * immediately without violating capacity restrictions, returning     * {@code true} upon success and {@code false} if no space is currently     * available.  When using a capacity-restricted deque, this method is     * generally preferable to the {@link #add} method, which can fail to     * insert an element only by throwing an exception.     *     * <p>This method is equivalent to {@link #offerLast}.     *     * @param e the element to add     * @return {@code true} if the element was added to this deque, else     *         {@code false}     * @throws ClassCastException if the class of the specified element     *         prevents it from being added to this deque     * @throws NullPointerException if the specified element is null and this     *         deque does not permit null elements     * @throws IllegalArgumentException if some property of the specified     *         element prevents it from being added to this deque     */    boolean offer(E e);    /**     * Retrieves and removes the head of the queue represented by this deque     * (in other words, the first element of this deque).     * This method differs from {@link #poll poll} only in that it throws an     * exception if this deque is empty.     *     * <p>This method is equivalent to {@link #removeFirst()}.     *     * @return the head of the queue represented by this deque     * @throws NoSuchElementException if this deque is empty     */    E remove();    /**     * Retrieves and removes the head of the queue represented by this deque     * (in other words, the first element of this deque), or returns     * {@code null} if this deque is empty.     *     * <p>This method is equivalent to {@link #pollFirst()}.     *     * @return the first element of this deque, or {@code null} if     *         this deque is empty     */    E poll();    /**     * Retrieves, but does not remove, the head of the queue represented by     * this deque (in other words, the first element of this deque).     * This method differs from {@link #peek peek} only in that it throws an     * exception if this deque is empty.     *     * <p>This method is equivalent to {@link #getFirst()}.     *     * @return the head of the queue represented by this deque     * @throws NoSuchElementException if this deque is empty     */    E element();    /**     * Retrieves, but does not remove, the head of the queue represented by     * this deque (in other words, the first element of this deque), or     * returns {@code null} if this deque is empty.     *     * <p>This method is equivalent to {@link #peekFirst()}.     *     * @return the head of the queue represented by this deque, or     *         {@code null} if this deque is empty     */    E peek();    // *** Stack methods ***    /**     * Pushes an element onto the stack represented by this deque (in other     * words, at the head of this deque) if it is possible to do so     * immediately without violating capacity restrictions, throwing an     * {@code IllegalStateException} if no space is currently available.     *     * <p>This method is equivalent to {@link #addFirst}.     *     * @param e the element to push     * @throws IllegalStateException if the element cannot be added at this     *         time due to capacity restrictions     * @throws ClassCastException if the class of the specified element     *         prevents it from being added to this deque     * @throws NullPointerException if the specified element is null and this     *         deque does not permit null elements     * @throws IllegalArgumentException if some property of the specified     *         element prevents it from being added to this deque     */    void push(E e);    /**     * Pops an element from the stack represented by this deque.  In other     * words, removes and returns the first element of this deque.     *     * <p>This method is equivalent to {@link #removeFirst()}.     *     * @return the element at the front of this deque (which is the top     *         of the stack represented by this deque)     * @throws NoSuchElementException if this deque is empty     */    E pop();    // *** Collection methods ***    /**     * Removes the first occurrence of the specified element from this deque.     * If the deque does not contain the element, it is unchanged.     * More formally, removes the first element {@code e} such that     * <tt>(o==null ? e==null : o.equals(e))</tt>     * (if such an element exists).     * Returns {@code true} if this deque contained the specified element     * (or equivalently, if this deque changed as a result of the call).     *     * <p>This method is equivalent to {@link #removeFirstOccurrence(Object)}.     *     * @param o element to be removed from this deque, if present     * @return {@code true} if an element was removed as a result of this call     * @throws ClassCastException if the class of the specified element     *         is incompatible with this deque     * (<a href="Collection.html#optional-restrictions">optional</a>)     * @throws NullPointerException if the specified element is null and this     *         deque does not permit null elements     * (<a href="Collection.html#optional-restrictions">optional</a>)     */    boolean remove(Object o);    /**     * Returns {@code true} if this deque contains the specified element.     * More formally, returns {@code true} if and only if this deque contains     * at least one element {@code e} such that     * <tt>(o==null ? e==null : o.equals(e))</tt>.     *     * @param o element whose presence in this deque is to be tested     * @return {@code true} if this deque contains the specified element     * @throws ClassCastException if the type of the specified element     *         is incompatible with this deque     * (<a href="Collection.html#optional-restrictions">optional</a>)     * @throws NullPointerException if the specified element is null and this     *         deque does not permit null elements     * (<a href="Collection.html#optional-restrictions">optional</a>)     */    boolean contains(Object o);    /**     * Returns the number of elements in this deque.     *     * @return the number of elements in this deque     */    public int size();    /**     * Returns an iterator over the elements in this deque in proper sequence.     * The elements will be returned in order from first (head) to last (tail).     *     * @return an iterator over the elements in this deque in proper sequence     */    Iterator<E> iterator();    /**     * Returns an iterator over the elements in this deque in reverse     * sequential order.  The elements will be returned in order from     * last (tail) to first (head).     *     * @return an iterator over the elements in this deque in reverse     * sequence     */    Iterator<E> descendingIterator();}




0 0
原创粉丝点击