结果
代码
import java.util.ArrayList;
import java.util.List;
/**
* 设计循环队列
*/
public class MyCircularQueue {
//数组
private Integer[] data;
//头指针
private int head;
//尾指针
private int tail;
//长度
private int length;
/**
* 初始化参数
* @param k 队列长度
*/
private MyCircularQueue(int k)
{
//初始化数组
data = new Integer[k];
head = 0;
tail = 0;
length = k;
}
/**
* 入队列
* @param value 加入队列的值
* @return 判断是否能够加入
*/
private boolean enQueue(int value)
{
//判断队列是否已满,满则返回false
if (isFull())
{
return false;
}
//入队
data[tail] = value;
//对位后移,这里tail始终指向队尾的下一个位置
tail = (tail+1)%length;
return true;
}
/**
* 出队操作
* @return 返回是否能够出队
*/
public boolean deQueue()
{
//判断队列是否为空
if (isEmpty())
{
return false;
}
//元素出队
data[head] = null;
//对头元素后移
head = (head+1)%length;
return true;
}
/**
* 取队头元素
* @return 返回队头元素
*/
public int Front()
{
if (isEmpty())
{
return -1;
}
return data[head];
}
/**
* 取队尾元素
* @return 返回队尾元素
*/
private int Rear()
{
if (isEmpty())
{
return -1;
}
if (tail!=0)
{
return data[tail-1];
}
return data[length-1];
}
/**
* 判断队列是否为空
* @return
*/
private boolean isEmpty()
{
return head==tail&&data[head]==null;
}
/**
* 判断队列是否已满
* @return
*/
private boolean isFull()
{
return head==tail&&data[head]!=null;
}
/**
* Your MyCircularQueue object will be instantiated and called as such:
* MyCircularQueue obj = new MyCircularQueue(k);
* boolean param_1 = obj.enQueue(value);
* boolean param_2 = obj.deQueue();
* int param_3 = obj.Front();
* int param_4 = obj.Rear();
* boolean param_5 = obj.isEmpty();
* boolean param_6 = obj.isFull();
*/
public static void main(String[] args) {
MyCircularQueue obj = new MyCircularQueue(3);
System.out.println(obj.enQueue(1)); //true
System.out.println(obj.enQueue(2)); //true
System.out.println(obj.enQueue(3)); //true
System.out.println(obj.enQueue(4)); //false
System.out.println(obj.Rear()); //3
System.out.println(obj.isFull()); //true
System.out.println(obj.deQueue()); //true
System.out.println(obj.enQueue(4)); //true
System.out.println(obj.Rear()); //4
}
}
思路
队列是相对简单的数据结构,符合FIFO。循环队列则可以用数组进行模拟,设head指向队列头部,tail指向队
列的尾部,则可以通过求模运算来计算进队出队时head和tail的结果。