循环队列基于数组实现
front:指向循环队列的第一个元素索引
tail:指向循环队列的最后一个元素的下一个位置
注意:当要存储的元素个数为K,则数组大小要开辟k+1,需要浪费一个空间
判断当前循环队列为空:front = tail
判断当前循环队列为满:(tail+1)%data.length = front
每次front和tail添加或者删除元素向后移动:
(front+1)%data.length
(tail+1)%data.length
取模的核心:当走到末尾时继续从头开始入队和出队,形成循环
具体实现如下:
public class LoopQueue implements Queue{
private int[] data;
//有效元素个数
private int size;
//指向队首元素下标
private int front;
//指向队尾元素的下一个位置下标
private int tail;
public LoopQueue(int k) {
data = new int[k + 1];
}
@Override
public void offer(int value) {
if (isFull()){
System.err.println("queue is full!");
return;
}
data[tail] = value;
tail = (tail + 1) % data.length;
size ++;
}
@Override
public int poll() {
if (isEmpty()){
System.err.println("queue is empty!");
return -1;
}
int value = data[front];
front = (front + 1) % data.length;
size --;
return value;
}
@Override
public int peek(){
if (isEmpty()){
System.err.println("queue is empty!");
return -1;
}
return data[front];
}
public boolean isFull(){
if ((tail + 1) % data.length == front){
return true;
}
return false;
}
public boolean isEmpty(){
return tail == front;
}
public int getSize(){
return size;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();;
sb.append("front [");
//遍历循环队列
for (int i = front; i != tail;) {
sb.append(data[i]);
int lastIndex = tail == 0 ? data.length - 1 : tail - 1;
if(i != lastIndex){
sb.append(",");
}
i = (i + 1) % data.length;
}
sb.append("] tail");
return sb.toString();
}
public static void main(String[] args) {
LoopQueue loopQueue = new LoopQueue(3);
loopQueue .offer(1);
loopQueue .offer(3);
loopQueue .offer(5);
System.out.println(loopQueue);
}
}