没想通怎么满额复用初始化队列空间
package com.kali.structure;
/**
* 前提:这是一个环形链表
* 通过取模算法用数组来实现队列并可复用
* 1.队列为空的条件判断
* front == rear
* 2.队列满的条件判断
* (rear+1) % maxSize == front
* 3.添加元素
* rear = (rear+1) % maxSize
* 4.获取元素
* front = (front+1) % maxSize
* ********* 3、4步取模原因是为了让指针周期性复用
* 5.遍历元素
* front + offset()
* 解析:maxSize - front得到之后元素,加上rear中间的叠加区直接取maxSize模可得
* offset = (maxSize - front + rear) % maxSize
* 6.获取头元素
* return queue[front]
* 在算法的设计过程中将一个位置空出来作为约定,所以实际的有效元素会少一个
* 这个所谓的约定就是一个预留空间,始终在rear的后一个位置
*/
public class RingQueue {
private int front;
private int rear;
private int maxSize;
private int[] queue;
public RingQueue(int init){
this.maxSize = init;
queue = new int[maxSize];
}
public static void main(String[] args) {
RingQueue queue = new RingQueue(5);
queue.add(1);
queue.add(2);
queue.add(3);
queue.add(4);
//queue.get();
queue.add(5);
queue.showQueue();
//System.out.println(queue.head());
}
public boolean isFull(){
/*
假设rear在队列下半部分,front在上半部分,那么rear+1刚好与位于
上半的font重合,说明这一个周期内的元素还未使用,判定为"满"
*/
return (rear+1) % maxSize == front;
}
public boolean isEmpty(){
return front == rear;
}
public void add(int num){
if(isFull()){
System.out.println("队列已满");
}else{
queue[rear] = num;
rear = (rear+1) % maxSize;
}
}
public int get(){
if(isEmpty()){
System.out.println("队列为空");
}
int value = queue[front];
front = (front+1) % maxSize;
return value;
}
public void showQueue(){
for(int i = front;i < front + offset();i++){
System.out.println(queue[i]);
}
}
public int offset(){
return (maxSize - front + rear) % maxSize;
}
public int head(){
if(isEmpty()){
System.out.println("队列为空");
}
return queue[front];
}
}