1,抽象数据类型:
public interface Queue {
public boolean isEmpty();
public Object getFrontElement();
public Object getRearElement();
public void put(Object theObject);
public Object remove();
}
2,数组表示:
public class ArrayQueue implements Queue {
int front; // one counterclockwise from first element
int rear; // position of rear element of queue
Object[] queue; // element array
public ArrayQueue(int initialCapacity) {
if (initialCapacity < 1)
throw new IllegalArgumentException("initialCapacity must be >= 1");
queue = new Object[initialCapacity + 1];
}
public ArrayQueue() {
this(10);
}
public boolean isEmpty() {
return front == rear;
}
public Object getFrontElement() {
if (isEmpty())
return null;
else
return queue[(front + 1) % queue.length];
}
public Object getRearElement() {
if (isEmpty())
return null;
else
return queue[rear];
}
public void put(Object theElement) {
if ((rear + 1) % queue.length == front) {
Object[] newQueue = new Object[2 * queue.length];
int start = (front + 1) % queue.length;
if (start < 2)
System.arraycopy(queue, start, newQueue, 0, queue.length - 1);
else {
System.arraycopy(queue, start, newQueue, 0, queue.length
- start);
System.arraycopy(queue, 0, newQueue, queue.length - start,
rear + 1);
}
front = newQueue.length - 1;
rear = queue.length - 2;
queue = newQueue;
}
rear = (rear + 1) % queue.length;
queue[rear] = theElement;
}
public Object remove() {
if (isEmpty())
return null;
front = (front + 1) % queue.length;
Object frontElement = queue[front];
queue[front] = null;
return frontElement;
}
}
3,链节点定义:
public class ChainNode {
Object element;
ChainNode next;
ChainNode() {
}
ChainNode(Object element) {
this.element = element;
}
ChainNode(Object element, ChainNode next) {
this.element = element;
this.next = next;
}
}
4,链表表示
public class LinkedQueue implements Queue {
protected ChainNode front;
protected ChainNode rear;
public LinkedQueue(int initialCapacity) {
}
public LinkedQueue() {
this(0);
}
public boolean isEmpty() {
return front == null;
}
public Object getFrontElement() {
if (isEmpty())
return null;
else
return front.element;
}
public Object getRearElement() {
if (isEmpty())
return null;
else
return rear.element;
}
public void put(Object theElement) {
ChainNode p = new ChainNode(theElement, null);
if (front == null)
front = p; // empty queue
else
rear.next = p; // nonempty queue
rear = p;
}
public Object remove() {
if (isEmpty())
return null;
Object frontElement = front.element;
front = front.next;
if (isEmpty())
rear = null; // enable garbage collection
return frontElement;
}
}