Java Queue 队列

队列是一种先进先出的数据结构,队列中插入元素和删除元素分别位于队列的两端。 

在Java中 队列实现类众多,本文不再赘述。本文探讨的是如何自定义队列实现类:

基于数组方式实现队列:

注意点:

当出队时队首为空,如果不移动队列元素那么会使得队尾在插入元素过程中越界,因队首为空,数组实际使用空间小于数组的大小,所有要移动队列的元素。

而且每次出队都要移动,使得耗费大量的时间。

import java.util.Arrays;

public class ArrayQueue<E> {
    Object[] queue;
    int size;

    public ArrayQueue() {
        queue = new Object[10];
    }

    public boolean isEmpty() {
        return size == 0;
    }

    //入队
    public void offer(E data) {
        ensureCapacity(size+1);
        queue[size++] = data;
    }
    
    //出队
    public E poll() {
        if (isEmpty()) return null;
        E data = (E) queue[0];
        System.arraycopy(queue, 1, queue, 0, size-1); //填满空位
        size--;
        return data;
    }
    
    //扩容
    private void ensureCapacity(int size) {
        if (size > queue.length) {
            int len = queue.length + 10;
            queue = Arrays.copyOf(queue, len);
        }
    }

    public static void main(String[] args) {
        ArrayQueue<Integer>  queue = new ArrayQueue<>();

        for (int i = 0; i < 20; i++) {
            queue.offer(i);
        }
        for (int i = 0; i < 10; i++) {
            System.out.println("出队元素:"+queue.poll());
        }
    }
}

 

基于链表实现的队列

由于链表的地址是不连续的的所以无须扩容。出队和入队都非常快。

class ListNode<E> {
    ListNode<E> next = null;
    E data;
    public ListNode(E data) {
        this.data = data;
    }
}

public class ListQueue<E> {
    
    private ListNode<E> head = null;        //队首
    private ListNode<E> end = null;         //队尾

    public boolean isEmpty() {
        return head == null;
    }

    //入队
    public void offer(E e) {
        ListNode<E> node = new ListNode<E>(e);
        if (isEmpty()) {
            head = node;
            end = node;
            return;
        }
        end.next = node;
        end = node;
    }

    //出队
    public E poll() {
        if (isEmpty()) return null;
        E data = head.data;
        head = head.next;
        return data;
    }


    public static void main(String[] args) {
        ListQueue<String> queue = new ListQueue<>();
        System.out.println("入队");
        queue.offer("first");
        queue.offer("second");
        System.out.println("出队"+queue.poll());
        System.out.println("出队"+queue.poll());
    }
}

 

posted @ 2020-08-20 15:51  一文搞懂  阅读(1054)  评论(0编辑  收藏  举报