一、队列的定义:
定义:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表,LIFO。树
队列这个概念非常好理解。你可以把它想成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的“队列”。
栈:后进先出。
二、队列的特点
三.队列的分类
(1)顺序(单向)队列:(Queue) 只能在一端插入数据,另一端删除数据
(2)循环(双向)队列(Deque):每一端都可以进行插入数据和删除数据操作
四、队列的经典应用
1.多线程、线程池任务列
五、代码模拟实现队列
public class MyQueue {
private int queueMaxSize = 0; //定义队列的数量
private int curQueueSize = 0; //队列当前的大小
private int[] queue; //队列
public MyQueue(int queueSize) {
this.queueMaxSize = queueSize;
this.queue = new int[queueSize];
}
/***入队*/
public boolean inQueue(int val) {
if (curQueueSize >= queueMaxSize) { //判断队列是否满了
return false; //这里可以模仿线程池搞个拒绝策略,没能加入到队列的回头再处理
}
queue[curQueueSize] = val;
curQueueSize++;
return true;
}
/***出队*/
public int outQueue() {
int value = queue[0];
curQueueSize--;
queue[0] = 0;
dataMove(); //当然这里可以搞算法优化,比如出队过半了或者满了之后再进行数据移动,而不是每次出队都进行数据移动
return value;
}
/***移动队列数据*/
public boolean dataMove() {
for (int i = 0; i < queueMaxSize - 1; i++) {
queue[i] = queue[i + 1];
}
return true;
}
/***打印*/
public void print() {
for (int i = 0; i < queueMaxSize; i++) {
System.out.println(i + ":" + queue[i]);
}
}
}