数据结构和算法--双端队列

该文提供了两种实现Deque接口的方式,一种基于链表,另一种基于数组。每个实现都包括了添加元素(offerFirst和offerLast)、移除元素(pollFirst和pollLast)、查看元素(peekFirst和peekLast)以及判断队列是否满或空的方法。同时,两个实现都包含了迭代器以遍历队列元素。
摘要由CSDN通过智能技术生成

链表实现

package com.zwz.deque;

import java.util.Iterator;

public class DequeServiceImpl<E> implements DequeService<E> {

    static class Node<E> {
        Node<E> prev; //上一个
        E e;
        Node<E> next; //下一个

        public Node(Node<E> prev, E e, Node<E> next) {
            this.prev = prev;
            this.e = e;
            this.next = next;
        }
    }

    final int capacity = 10;
    int size = 0;
    /**
     * 哨兵
     */
    Node<E> head = new Node<>(null,null,null);

    public DequeServiceImpl(){
        head.prev = head;
        head.next = head;
    }
    @Override
    public Boolean offerFirst(E value) {
        if (isfull()) {
            return false;
        }
        Node<E> a = head;
        Node<E> b = head.next;

        Node<E> added = new Node<>(a,value,b);
        a.next = added;
        b.prev = added;
        size++;
        return true;
    }

    @Override
    public Boolean offerLast(E value) {
        if (isfull()) {
            return false;
        }
        Node<E> a = head.prev;
        Node<E> b = head;

        Node<E> added = new Node<>(a,value,b);
        a.next = added;
        b.prev = added;
        size++;
        return true;
    }

    @Override
    public E pollFirst() {
        if (isEmpty()) {
            return null;
        }
        Node<E> a = head;
        Node<E> removed = a.next;
        Node<E> b = removed.next;

        a.next = b;
        b.prev = a;

        size--;
        return removed.e;
    }

    @Override
    public E pollLast() {
        if (isEmpty()) {
            return null;
        }
        Node<E> b = head;
        Node<E> removed = b.prev;
        Node<E> a = removed.prev;

        a.next = b;
        b.prev = a;

        size--;
        return removed.e;
    }

    @Override
    public E peekFirst() {
        if (isEmpty()) {
            return null;
        }
        return head.next.e;
    }

    @Override
    public E peekLast() {
        if (isEmpty()) {
            return null;
        }
        return head.prev.e;
    }


    @Override
    public Boolean isfull() {
        return size == capacity;
    }

    @Override
    public Boolean isEmpty() {
        return size == 0;
    }

    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            Node<E> p = head.next;
            @Override
            public boolean hasNext() {
                return p != head;
            }

            @Override
            public E next() {
                E e = p.e;
                p = p.next;
                p.next.prev = p;
                return e;
            }
        };
    }
}

数组实现

package com.zwz.deque;

import java.util.Iterator;

public class DequeServiceImpl2<E> implements DequeService<E> {

    E[] array = (E[]) new Object[5];

    int head = 0;//头
    int tail = 0;//尾

    //加1时候,保证指针合法
    int inc(int i) {
        if (i + 1 > array.length-1) {
            return 0;
        }
        return i + 1;
    }

    int dec(int i) {
        if (i - 1 < 0) {
            return array.length - 1;
        }
        return i - 1;
    }

    @Override
    public Boolean offerFirst(E value) {
        if (isfull()) {
            return false;
        }
        head = dec(head);
        array[head] = value;
        return true;
    }

    @Override
    public Boolean offerLast(E value) {
        if (isfull()) {
            return false;
        }
        array[tail] = value;
        tail = inc(tail);
        return true;
    }

    @Override
    public E pollFirst() {
        if (isEmpty()) {
            return null;
        }
        E e = array[head];
        array[head] = null;
        head = inc(head);
        return e;
    }

    @Override
    public E pollLast() {
        if (isEmpty()) {
            return null;
        }
        tail = dec(tail);
        E e = array[tail];
        array[tail] = null;
        return e;
    }

    @Override
    public E peekFirst() {
        if (isEmpty()) {
            return null;
        }
        return array[head];
    }

    @Override
    public E peekLast() {
        if (isEmpty()) {
            return null;
        }
        return array[dec(tail)];
    }

    @Override
    public Boolean isfull() {
        int addTail = inc(tail);
        return addTail == head;
    }

    @Override
    public Boolean isEmpty() {
        return head == tail;
    }

    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            int p = head;

            @Override
            public boolean hasNext() {
                return p != tail;
            }

            @Override
            public E next() {
                E e = array[p];
                p = inc(p);
                return e;
            }
        };
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值