您的位置:首页 > 理论基础 > 数据结构算法

数据结构-队列

2016-12-01 17:29 148 查看

队列

队列是先进先出的集合数据结构

从队列取出元素的顺序与元素入队的顺序是一致的。

分析要求

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晚上回来写
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: