继续复习......
定义
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
代码实现
//可变长度的队列实现
public class ResizingArrayQueue<Item> implements Iterable<Item> {
private Item[] a = (Item[]) new Object[1]; // 数组不能直接使用泛型
private int head = 0; // 队列头索引
private int tail = 0; // 队列尾索引
private int N = 0; // 队列中元素的数目
/**
* 返回队列是否为空值。
* @return true 队列为空,false 队列不为空。
*/
public boolean isEmpty() {
return N == 0;
}
/**
* 返回队列中元素的数目。
* @return 队列中元素的数目。
*/
public int size() {
return N;
}
/**
* 添加元素到队尾。
* 如果队尾容量不足,调用resize()方法动态调整。
* @param item 被添加的元素
*/
public void add(Item item) {
//N增加至数组容量时,动态扩展为原来的2倍。
if (N == a.length)
resize(a.length * 2);
//从尾部添加元素
a[tail++] = item;
//N加一
N++;
}
/**
* 移除队列元素并返回被删除的元素。
* 如果队列非空元素过少则减少空间。
* @return Item 被删除的元素。
*/
public Item remove() {
Item item = a[head]; // 从队列头移除元素
a[head++] = null; // 将队列头元素设为null避免对象游离
N--; // N减一
//如果索引增加到数组长度重新置0
if (head == a.length)
head = 0;
// 如果队列非空元素过少则减少空间
if (N <= a.length / 4)
resize(a.length / 2)
return item;
}
/*
* 重置队列大小的方法
* @param 重置队列的大小
*/
public void resize(int n) {
//创建一个新数组。
Item[] items=(Item[])new Object[n];
//将老数组赋给新数组。
for(int i=0;i<N;i++) {
items[i]=a[(i+head)%a.length];
}
a=items;
//将头元素和尾部元素分别置位.
head=0;
tail=N;
}
/**
* 实现iterable的方法
*/
@Override
public Iterator<Item> iterator() {
return new QueueIterator();
}
class QueueIterator implements Iterator<Item> {
int i=0;
@Override
public boolean hasNext() {
return i<N;
}
@Override
public Item next() {
Item item=a[(i+head)%a.length]; //从头元素开始获取元素.
i++;
return item;
}
}
}
ps:台风山竹真的有点吓人......