1、front指向队首第一个元素
2、rear指向队尾的下一个元素
3、队列中元素个数为:(rear+maxSize-front)%maxSize
4、队列空:rear == front
5、队列满(元素个数为数组大小-1):(rear+1)%maxSize == front
java代码实现:
package com.lhhh.queue;
/**
* 数组模拟环形队列
* @author lhhh
*/
public class ArrayQueue {
/**
* 对象数组,队列最多存储a.length()-1个元素
* 也就是需要留出一个空位置
* 用来区分队列为空还是满
*/
private Object[] arr;
/**
* 队列头部
* 指向队列的第一个元素
*/
private int front;
/**
* 队列尾部
* 指向队列尾部的下一个位置
*/
private int rear;
public ArrayQueue() {
this(5);
}
public ArrayQueue(int size) {
arr = new Object[size];
front = 0;
rear = 0;
}
/**
* 队列是否空
* @return
*/
public boolean isEmpty(){
return front==rear;
}
/**
* 队列是否满
* @return
*/
public boolean isFull(){
return (rear+1)% arr.length==front;
}
/**
* 入队列
* @param b
* @return
*/
public boolean addQueue(Object b) {
//队列满
if (isFull()) {
System.out.println("队列满");
return false;
}
//入队
arr[rear] = b;
rear = (rear + 1) % arr.length;
return true;
}
/**
* 出队列
* @return
*/
public Object getQueue() {
//队列空
if (isEmpty()) {
System.out.println("队列空");
return false;
}
//出队
Object obj = arr[front];
front = (front + 1) % arr.length;
return obj;
}
/**
* 队列元素总数
* @return
*/
public int size(){
return (rear+ arr.length-front)% arr.length;
}
/**
* 遍历队列
*/
public void showQueue(){
if(isEmpty()){
System.out.println("[]");
return;
}
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = front; i < front+size(); i++) {
if(i!=rear-1){
sb.append(arr[i]+",");
} else{
sb.append(arr[i]);
}
}
sb.append("]");
System.out.println(sb);
}
/**
* 输出队列头
* @return
*/
public Object headQueue(){
if(isEmpty()){
System.out.println("队列空");
return null;
}
return arr[front];
}
public static void main(String[] args) {
ArrayQueue arrayQueue = new ArrayQueue();
arrayQueue.addQueue(3);
arrayQueue.addQueue(4);
arrayQueue.addQueue(5);
Object queue = arrayQueue.getQueue();
System.out.println(queue);
arrayQueue.showQueue();
}
}