简易先进先出队列-自用
/**
* _______________*********_______________________
* ______________************_____________________
* ______________*************____________________
* _____________**__***********___________________
* ____________***__******_*****__________________
* ____________***_*******___****_________________
* ___________***__**********_****________________
* __________****__***********_****_______________
* ________*****___***********__*****_____________
* _______******___***_********___*****___________
* _______*****___***___********___******_________
* ______******___***__***********___******_______
* _____******___****_**************__******______
* ____*******__*********************_*******_____
* ____*******__******************************____
* ___*******__******_*****************_*******___
* ___*******__******_******_*********___******___
* ___*******____**__******___******_____******___
* ___*******________******____*****_____*****____
* ____******________*****_____*****_____****_____
* _____*****________****______*****_____***______
* ______*****______;***________***______*________
* ________**_______****________****______________
*
* @author 闫影 - yanying876@gmail.com
* @Package user
* @date 2020/6/1916:53
*/
public class QueueY<T> {
// 队列最多容纳数量 初始化的时候可以根据自己时间情况设置的相对大一些 总归是空间换时间
// 考虑 队列慢的情况下可以使用线程让其代替等待
private int maxSize;
private Object[] queueArray;
// 队头
private int front;
// 队尾
private int rear;
private int size;
public QueueY(int length) {
maxSize = length;
queueArray = new Object[maxSize];
front = 0;
rear = -1;
size = 0;
}
/** 入队: 先将rear(队为指针) 加1, 后将数据项存入rear的位置。
* 当rear 指向maxSize -1 的位置时,将rear 设置为-1(循环队列),加1 后存入数据项。
*/
public void enQueue(T str){
// 入队之前先检查队列是否已满,已满则抛出异常。
if(isFull()){
//这里是抛出了一个异常 根据时间使用情况这里可以另做处理
throw new RuntimeException("队列已满," + str + " 不能入队!");
}
if(rear == maxSize -1){
rear = -1;
}
queueArray[++rear] = str; // 先将 rear 加1,后取值
size++;
}
/**出队: 先取出front 的值,然后将front 减1
* 如果 front 超过了数组的顶端,将 front 设置为 0(循环队列)
*/
@SuppressWarnings("unchecked")
public T deQueue(){
// 出队之前先检查队列是否为空。
// 这里根据实际情况可做另外处理 比如等待 返回特定值
if(isEmpty()){
System.out.printf("队列为空,不能出队!");
return null;
}
T str = (T) queueArray[front++]; // 先去 queueArray[front] 的值,后将front 加1
if(front == maxSize){
front = 0;
}
size--;
return str;
}
/**查看对头数据项
*/
@SuppressWarnings("unchecked")
public T peek(){
// 查看队头时,判断是否为空, 为空则抛出异常。
// 此处根据实际情况可以单独处理
if(isEmpty()){
throw new RuntimeException("队列为空!");
}
return (T) queueArray[front];
}
/** 判断队列是否为空。队空: rear + 1 = front 或 front + maxSize -1 = rear
* 通过数组容量比队列数据项的最大值大一,来区分对空和对满。
*/
public boolean isEmpty(){
return (rear + 1 == front || front + maxSize -1 == rear);
}
/**判断队列是否为满。 队满: rear + 2 = front 或 front + maxSize -2 = rear
* 通过数组容量比队列数据项的最大值大一,来区分对空和对满。
*/
public boolean isFull(){
return (rear + 2 == front || front + maxSize -2 == rear);
}
/** 获取队列的大小
*/
public int queueSize(){
/* 可以通过队头队尾计算出队列的大小,也可以通过一个计数器,当入队是加1,出队是减1.
if(rear >= front){
return rear - front +1;
}else {
return maxSize - front + (rear + 1);
}
*/
return size;
}
// public static void main(String[] args) {
// Queue<String> queue = new Queue<>(5);
// queue.enQueue("a");
// queue.enQueue("b");
// queue.enQueue("c");
// queue.enQueue("d");
// queue.deQueue();
// queue.deQueue();
//
// System.out.println("队列是否为空: " + queue.isEmpty() + " 队列是否满: " + queue.isFull());
// System.out.println("队列大小:" + queue.queueSize());
//
// int size = queue.queueSize();
// for(int i = 0; i < size; i++){
// String str = queue.deQueue();
// System.out.print(str + " ");
// }
//
// }