1.数组实现队列
优化:当tail指针到末尾时,而队列依然还有空闲空间,但不能插入数据。进行数据搬移
package queue;
public class ArrayQueue {
//--数组:Items 大小:n
private String[] items;
private int n;
//head 表示队头下标 tail 表示队尾下标
private int head=0;
private int tail=0;
//申请一个大小为capacity的数组
public ArrayQueue(int capacity){
items=new String[capacity];
n=capacity;
}
//--入队
// public boolean enQueue(String item){
// //队列已满
// if(tail==n)
// return false;
// //队列未满
// items[tail]=item;
// ++tail;
// return true;
// }
//--入队函数优化(解决数组有空闲空间但无法插入数据的问题)
public boolean enQueue(String item){
// tail == n 表示队列末尾没有空间了
if(tail==n){
// tail ==n && head==0,表示整个队列都...
if(head==0){//队列已满
return false;
}
//--数据搬移
for(int i=head;i<tail;i++){
items[i-head]=items[i];
}
//--搬移完之后重新更新head和tail
tail=tail-head;
head=0;
}
items[tail]=item;
++tail;
return true;
}
//出队
public String deQueue(){
//如果 head == tail 表示队列为空
if(head==tail)
return null;
//队列不为空
String ret=items[head];
++head;
return ret;
}
}
2.循环数组实现队列
可以避免数据偏移
public class CircularQueue {
// 数组:items,数组大小:n
private String[] items;
private int n = 0;
// head 表示队头下标,tail 表示队尾下标
private int head = 0;
private int tail = 0;
// 申请一个大小为 capacity 的数组
public CircularQueue(int capacity) {
items = new String[capacity];
n = capacity;
}
// 入队
public boolean enqueue(String item) {
// 队列满了
if ((tail + 1) % n == head) return false;
items[tail] = item;
tail = (tail + 1) % n;
return true;
}
// 出队
public String dequeue() {
// 如果 head == tail 表示队列为空
if (head == tail) return null;
String ret = items[head];
head = (head + 1) % n;
return ret;
}
}