队列
队列是先进先出的集合数据结构
从队列取出元素的顺序与元素入队的顺序是一致的。
分析要求
1 时间,空间复杂度尽量小
2 可迭代,可Foreach
3 支持泛型
接口设计
public interface QueueInterface<T> extends Iterable<T> {
/** 入队 */
void enqueue(T t);
/** 出队 */
T dequeue();
/** 是否为空 */
boolean isEmpty();
/** 元素个数 */
int size();
}
基于数组的实现
public class Queue<Item> implements QueueInterface<Item> {
private Item[] data = (Item[]) new Object[8];
private int start = 0;//有效元素的开始,含start
private int end = 0;//有效元素的结束,不含end
public void enqueue(Item item) {//入队
if (end == data.length) resize(data.length * 2 + 1);//防止出现数组长度为0
data[end++] = item;
}
public Item dequeue() {//出队
if (start > 0 && start >= data.length / 2) resize((end - start) * 2 + 1);
return isEmpty() ? null : data[start++];
}
public boolean isEmpty() { return end <= start;}//判空
public int size() {return end - start;}//获取长度
public Iterator<Item> iterator() {//迭代
return new Iterator<Item>() {
private int idx = 0;
public boolean hasNext() {return size() - idx > 0;}
public Item next() {return hasNext() ? data[start + idx++] : null;}
public void remove() {}
};
}
private void resize(int newSize) {//重新调整数组的大小和索引位置
Item[] temp = (Item[]) new Object[newSize];
for (int i = start; i < end; i++) {
temp[i - start] = data[i];
}
data = temp;
end = end - start;
start = 0;
}
}
基于链表的实现
//TODO晚上回来写