ArrayQueue(数组队列)

Queue定义,直接copyJava的Queue,去除了Collection接口。

public interface Queue<E> {
    
    /**
     * Inserts the specified element into this queue 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.
     *
     * @param e the element to add
     * @return {@code true} (as specified by
     * @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 queue
     * @throws NullPointerException if the specified element is null and
     *         this queue does not permit null elements
     * @throws IllegalArgumentException if some property of this element
     *         prevents it from being added to this queue
     */
    boolean add(E e);

    /**
     * Inserts the specified element into this queue if it is possible to do
     * so immediately without violating capacity restrictions.
     * When using a capacity-restricted queue, this method is generally
     * preferable to {@link #add}, 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 queue, else
     *         {@code false}
     * @throws ClassCastException if the class of the specified element
     *         prevents it from being added to this queue
     * @throws NullPointerException if the specified element is null and
     *         this queue does not permit null elements
     * @throws IllegalArgumentException if some property of this element
     *         prevents it from being added to this queue
     */
    boolean offer(E e);

    /**
     * Retrieves and removes the head of this queue.  This method differs
     * from {@link #poll poll} only in that it throws an exception if this
     * queue is empty.
     *
     * @return the head of this queue
     * @throws NoSuchElementException if this queue is empty
     */
    E remove();

    /**
     * Retrieves and removes the head of this queue,
     * or returns {@code null} if this queue is empty.
     *
     * @return the head of this queue, or {@code null} if this queue is empty
     */
    E poll();

    /**
     * Retrieves, but does not remove, the head of this queue.  This method
     * differs from {@link #peek peek} only in that it throws an exception
     * if this queue is empty.
     *
     * @return the head of this queue
     * @throws NoSuchElementException if this queue is empty
     */
    E element();

    /**
     * Retrieves, but does not remove, the head of this queue,
     * or returns {@code null} if this queue is empty.
     *
     * @return the head of this queue, or {@code null} if this queue is empty
     */
    E peek();
}

ArrayQueue

public class ArrayQueue implements Queue {

    // 数组
    int[] array;
    //最大值
    int maxSize;
    //
    int front;
    //
    int rear;

    static final float DEFAULT_LOAD_FACTOR = 0.75f;

    public ArrayQueue(int maxSize) {
        this.front = -1;
        this.rear = -1;
        this.array = new int[maxSize];
        this.maxSize = maxSize;
    }

    @Override
    public boolean add(Object value) {
        reset();
        if (isFull()) {
            throw new IllegalArgumentException("queue if full, can not add!");
        }
        addDirectly(value);
        return  true;
    }

    @Override
    public boolean offer(Object value) {
        reset();
        if (isFull()) {
            System.out.println("queue if full, can not offer!");
            return false;
        }
        addDirectly(value);
        return  true;
    }

    @Override
    public Object remove() {
        if (isEmpty()) {
            throw new NoSuchElementException("queue if empty!");
        }
        return getDirectly();
    }

    @Override
    public Object poll() {
        if (isEmpty()) {
            return null;
        }
        return getDirectly();
    }

    @Override
    public Object element() {
        if (isEmpty()) {
            throw new NoSuchElementException("queue if empty!");
        }
        return array[front + 1];
    }

    @Override
    public Object peek() {
        if (isEmpty()) {
            return null;
        }
        return array[front + 1];
    }

    private boolean isEmpty() {
        return rear == front;
    }

    private void addDirectly(Object value) {
        this.array[++rear] = (int) value;
    }

    private int getDirectly() {
        ++front;
        int value = array[front];
        array[front] = 0;
        return value;
    }

    private boolean isFull() {
        if (this.rear == maxSize -1) {
            return true;
        }
        return false;
    }

    /**
     * 重置队列,希望可以有多余的空间
     */
    private void reset() {
        if (rear + 1 > maxSize * DEFAULT_LOAD_FACTOR) {
            if (front != -1) {
                int index = -1;
                int[] temp = new int[maxSize];
                for (int i = front + 1; i <= rear; i++) {
                    temp[++index] = this.array[i];
                }
                this.array = temp;
                this.rear = this.rear - front - 1;
                this.front = -1;
            }
        }
    }

    public static void main(String[] args) throws Exception {
        ArrayQueue queue =  new ArrayQueue(2);
        Scanner scanner = new Scanner(System.in);
        while(true) {
            System.out.println("o(offer)");
            System.out.println("p(poll)");

            char cmd = scanner.next().charAt(0);
            switch (cmd) {
                case 'o' :
                     System.out.println("请输入值需要添加的值....");
                     int value = scanner.nextInt();
                     queue.offer(value);
                     System.out.println(String.format("queue is : %s", Arrays.toString(queue.array)));
                     break;
                case 'p' :
                    System.out.println(String.format("value is : %s", queue.poll()));
                    System.out.println(String.format("queue is : %s", Arrays.toString(queue.array)));
                    break;
                default:
                     System.out.println("未知的命令" + cmd);
                     break;
            }
        }
    }
}

 

posted @ 2019-07-05 20:33  喝花茶  阅读(2669)  评论(0编辑  收藏  举报