Java,  算法和数据结构

如何实现一个双端队列

零双端队列性质

见名知意,就是可以在队首、队尾分别执行入队、出队操作的一种队列。

一实现思路

参照用数组实现队列的思路,我们就完全可以实现一个双端队列。因为,我们底层的动态数组已经实现了addFirst()/addLast(),removeFirst()/removeLast(),getFirst()/getLast()的方法。因此,我们双端队列如果需要在队首、队尾分别出队,入队的操作,我们只需要调用底层数据的对应方法就可以。另外,查看队首、队尾元素值,我们调用底层数组的getFirst()/getLast()方法即可。

二代码实现

/**
 * @Author:asher
 * @Date:2021/4/12 14:41
 * @Description:PACKAGE_NAME
 * @Version:1.0
 */
public class Deque<E> implements Queue<E> {
    private Array<E> array;
​
    public Deque(int capacity) {
        array = new Array<>(capacity);
    }
​
    public Deque() {
        this(10);
    }
​
    @Override
    public void enqueue(E e) {
        array.addLast(e);
    }
​
    //队首入队,双端队列新添加的方法
    public void enqueueFirst(E e) {
        array.addFirst(e);
    }
​
    @Override
    public E dequeue() {
        return array.removeFirst();
    }
​
    //队尾出队,双端队列新加的方法
    public E dequeueLast() {
        return array.removeLast();
    }
​
    @Override
    public E getFront() {
        return array.getFirst();
    }
​
    //查看队尾元素,双端队列新加的
    public E getLast() {
        return array.getLast();
    }
​
    @Override
    public int getSize() {
        return array.getSize();
    }
​
    @Override
    public boolean isEmpty() {
        return array.isEmpty();
    }
​
    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(String.format("Dequeue size: %d , length: %d\n", array.getSize(),array.getCapacity()));
        stringBuilder.append("Dequeue: head[");
        for (int i = 0; i < getSize(); i++) {
            stringBuilder.append(array.get(i));
            if (i != getSize()-1) {
                stringBuilder.append(" , ");
            }
        }
        stringBuilder.append("] tail");
        return stringBuilder.toString();
    }
​
    public static void main(String[] args) {
        Deque deque=new Deque(5);
        System.out.println(deque);
      //队尾入队元素2
        deque.enqueue(2);
        System.out.println(deque);
      //队首入队元素1
        deque.enqueueFirst(1);
        System.out.println(deque);
      //队首继续入队元素0
        deque.enqueueFirst(0);
      //队尾入队元素3
        deque.enqueue(3);
​
        System.out.println(deque);
      //队首出队
        System.out.println(deque.dequeue());
        System.out.println(deque);
      //队尾出队
        System.out.println(deque.dequeueLast());
        System.out.println(deque);
    }
}
//结果:
Dequeue size: 0 , length: 5
Dequeue: head[] tail
Dequeue size: 1 , length: 5
Dequeue: head[2] tail
Dequeue size: 2 , length: 5
Dequeue: head[1 , 2] tail
Dequeue size: 4 , length: 5
Dequeue: head[0 , 1 , 2 , 3] tail
0
Dequeue size: 3 , length: 5
Dequeue: head[1 , 2 , 3] tail
3
Dequeue size: 2 , length: 2
Dequeue: head[1 , 2] tail

说明:这个Dequeue的类,使我们自己通过动态数组实现的一个双端队列。JDK自带也有一个Deque接口。同时,我们的Dequeue也同样实现了前面我们自己定义的Queue那个接口。并且,添加了自己固有的在队尾出队dequeueLast()、队首添加元素的方法enqueueFirst()。

留言