首先我们了解什么是队列
队列就像下面那个表格一样是一个格子一个格子的,里面就是数据
1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
循环队列是长度一定的情况下,队头和队尾在队列中循环,队头指的不是物理上的,而是一个指针,队列遵循先进先出的原则,每次取数据是从队头取,队头指针则会向下指,例如
4 | 5 | 6 | 1 | 2 | 3 |
此时5就是队头而4就是队尾,这里有一个很重要的数学公式,由于队列长度一定,则你想要的尾指针位置=(队尾下标+1)%数组长度,而头指针=(队头下标+1)%数组长度,当队尾指针等于队头下标时,证明队列已满。但是注意!!!队尾指针不能和队头重合,就是说队尾指针指向的最后一个位置时队头指针的前一个位置,所以队列的最大容量比数组长度少一。
来看代码
public class MyQueue {
private int[] array;
private int front;
private int rear;
public MyQueue(int capacity){
this.array = new int[capacity];
}
/**
* 入队
* @param element 入队的元素
*/
public void enQueue(int element) throws Exception {
if((rear+1)%array.length == front){
throw new Exception("队列已满!");
}
array[rear] = element;
rear =(rear+1)%array.length;
}
/**
* 出队
*/
public int deQueue() throws Exception {
if(rear == front){
throw new Exception("队列已空!");
}
int deQueueElement = array[front];
front =(front+1)%array.length;
return deQueueElement;
}
/**
* 输出队列
*/
public void output(){
for(int i=front; i!=rear; i=(i+1)%array.length){
System.out.println(array[i]);
}
}
public static void main(String[] args) throws Exception {
MyQueue myQueue = new MyQueue(6);
myQueue.enQueue(3);
myQueue.enQueue(5);
myQueue.enQueue(6);
myQueue.enQueue(8);
myQueue.enQueue(1);
myQueue.deQueue();
myQueue.deQueue();
myQueue.deQueue();
myQueue.enQueue(2);
myQueue.enQueue(4);
myQueue.enQueue(9);
myQueue.output();
}
}