package com.coding.basic.queue; import java.util.NoSuchElementException; /** * Created by Korben on 18/02/2017. */ public class KArrayQueue<T> implements KQueue<T> { private int size; private Object[] dataArray = {}; private int front = 0; private int end = -1; public KArrayQueue() { } @Override public boolean add(T t) { ensureCapacity(size + 1); dataArray[end + 1] = t; end++; size++; return true; } @Override public boolean offer(T t) { ensureCapacity(size + 1); dataArray[end + 1] = t; end++; size++; return true; } @Override @SuppressWarnings("unchecked") public T remove() { if (end == -1) { throw new NoSuchElementException(); } T value = (T) dataArray[front]; dataArray[front] = null; size--; front++; if (front == dataArray.length) { front = 0; } if (size == 0) { end = -1; } return value; } @Override @SuppressWarnings("unchecked") public T poll() { if (end == -1) { return null; } T value = (T) dataArray[front]; dataArray[front] = null; size--; front++; if (front == dataArray.length) { front = 0; } return value; } @Override @SuppressWarnings("unchecked") public T element() { if (end == -1) { throw new NoSuchElementException(); } return (T) dataArray[front]; } @Override @SuppressWarnings("unchecked") public T peek() { if (end == -1) { return null; } return (T) dataArray[front]; } private void ensureCapacity(int minSize) { if (end == -1) { dataArray = new Object[8]; } else if (minSize >= dataArray.length) { int newLength = dataArray.length * 2; Object[] newDataArray = new Object[newLength]; if (front != 0) { System.arraycopy(dataArray, front, newDataArray, newLength - dataArray.length + front, dataArray.length - 1 - front); front += newLength - dataArray.length; } else { System.arraycopy(dataArray, front, newDataArray, front, size); } dataArray = newDataArray; } } }