|
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。这也就是我 们平常经常用说到的先进先出原则(FIFO)。java 中的 List 就可以作为队列来使用,在队列尾部添加元素则使用 list.add 方法,从队列头部删除元素则使用 list.remove 方法。
[pre] public interface Queue { /** * 入队: 从队尾加入一元素 * * @param target */ public void add(E target); /** * 出队: 移走队头元素 * * @param target * @return 当前队头元素 */ public E remove(); /** * 当前队列中的元素个数 */ public int size(); /** * 判断当前队列是否为空 * * @return */ public boolean isEmpty(); /** * 只是返回队头元素 * @return */ public E front(); } /** *基于数组的队列 * @param */ public class ArrayQueue implements Queue { private E[] data; private int size ;//队列中对象数量 private int front ;// 队列中第一个对象位置 private int rear ;//队列中当前对象位置 public ArrayQueue() { data = (E[]) new Object[10]; size = 0; front = 0; rear = 0; } public void add(E target) { if( isFull() ){ enlarge(); front = 0; } rear = (front + size) % data.length; data[rear] = target; size++; } public E front() { if (isEmpty()) { throw new RuntimeException("队列为空!"); } return data[front]; } public boolean isEmpty() { return size == 0; } public E remove() { if (isEmpty()) { throw new RuntimeException("队列为空!"); } E tempData = data[front]; data[front] = null; front = (front + 1) % (data.length); size--; return tempData; } public int size() { return size; } /** * 判断当前队列是否已满 * * @return */ public boolean isFull() { return size == data.length; } /** * 将数组容量扩大两倍 * */ public void enlarge() { E[] newData = (E[]) new Object[data.length * 2]; System.arraycopy(data, 0, newData, 0, data.length); data = newData; newData = null; } } 测试代码:
public void testArrayQueue(){ ArrayQueue q = new ArrayQueue(); q.add("a"); q.add("b"); q.add("c"); q.add("d"); q.add("e"); q.add("f"); q.add("g"); q.add("h"); q.add("i"); q.add("j"); q.add("k"); q.add("l"); q.add("m"); while( !q.isEmpty() ){ String temp = q.remove(); System.out.println(temp); } } [/pre] |
|