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; } } } }