基本概念
队列(Queue)是一种先进先出(FIFO)的结构,类似于生活中的“独木桥”、“排队”等
对于Queue,核心api如下:
方法 | 描述 |
---|---|
void enQueue(T s) | 向队列中添加一个新的元素 |
T deQueue() | 移除队列中最早添加的元素 |
boolean isEmpty() | 队列是否为空 |
int size() | 队列中元素的个数 |
队列的链表实现
deQueue方法就是返回链表中第一个元素
public T deQueue(){
T temp = first.item;
first = first.next;
number--;
if(isEmpty()){
last = null;
}
return temp;
}
enQueue,即在链表的末尾增加新的元素
public void enQueue(T item){
Node oldLast = last;
last = new Node();
last.item = item;
if(isEmpty()){
first = last;
}else{
oldLast.next = last;
}
number++;
}
队列的数组实现
用数组来保存数据,另外需要定义两个变量head和tail分别表示Queue的首尾元素。
当添加元素到队列时,tail的位置需要加1,将元素放到尾部,当删除元素时,head的位置需要减1,并返回。
public void enQueue(T item){
if((head-tail+1) == item.length){
reSize(2*item.length);
}
item[tail++] = item;
}
public T deQueue(){
T temp = item[--head];
item[head] = default(T);
if(head > 0 && (tail-head+1) == item.length/4 ){
reSize(item.length/2);
}
return temp;
}
public void reSize(int newSize){
T[] temp = new T[newSize];
int index = 0;
for(int i = head;i < tail; i++){
temp[++index] = item[i];
]
item = temp;
}
队列的使用场景
- 排队
- 播放器上的播放列表
- 数据流对象
- 异步的数据传输结构
- 解决共享资源的冲突访问,如打印机的打印队列
- 消息队列
- 交通状况模拟
- 呼叫中心用户等待队列