/**
* 队列,先进先出
* 头指针永远指向第一个元素
* 尾指针永远指向最后一个元素的后一个位置
* 所有10个容量的数组构成的队列最多容纳9个元素
*
* @param <T>
*/
public class MQueue<T> {
private final int length = 10;
private final Object[] entry = new Object[length];
private int head = 0;
private int tail = 0;
/**
* 初始状态头指针和尾指针执行同一个位置
*
* @return
*/
public boolean isEmpty() {
return head == tail;
}
/**
* 队列满,分为两种情况:
* 1.head在前,tail在后,此时head=0,tail=length-1为满
* 2.tail在前,head在后,此时head=tail+1为满
*
* @return
*/
public boolean isFull() {
return head == tail + 1 || (tail == length - 1 && head == 0);
}
/**
* 入队列,添加到队尾
* 如果数组后半部分已满,而数组前半部分有位置,则添加到数组之前半部分
*
* @param x
*/
public void enQueue(T x) {
if (isFull()) {
throw new IndexOutOfBoundsException("队列已满");
}
entry[tail] = x;
if (tail == length - 1) {
tail = 0;
} else {
tail = tail + 1;
}
}
/**
* 出队列,从队首出
*
* @return
*/
public T deQueue() {
if (isEmpty()) {
throw new IndexOutOfBoundsException("队列为空");
}
T x = (T) entry[head];
if (head == length - 1) {
head = 0;
} else {
head = head + 1;
}
return x;
}
public static void main(String[] args) {
MQueue<Integer> q = new MQueue<>();
for (int i = 0; i < 9; i++) {
q.enQueue(i);
}
System.out.println(q.head);
System.out.println(q.tail);
System.out.println(q.deQueue());
}
}