一、队列的定义:

定义:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表,LIFO。树
队列这个概念非常好理解。你可以把它想成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的“队列”。
栈:后进先出。

二、队列的特点

(1)线性表:链表或者数组
(2)FIFO

三.队列的分类

(1)顺序(单向)队列:(Queue) 只能在一端插入数据,另一端删除数据
image.png
(2)循环(双向)队列(Deque):每一端都可以进行插入数据和删除数据操作
image.png

四、队列的经典应用

1.多线程、线程池任务列

五、代码模拟实现队列

  1. public class MyQueue {
  2. private int queueMaxSize = 0; //定义队列的数量
  3. private int curQueueSize = 0; //队列当前的大小
  4. private int[] queue; //队列
  5. public MyQueue(int queueSize) {
  6. this.queueMaxSize = queueSize;
  7. this.queue = new int[queueSize];
  8. }
  9. /***入队*/
  10. public boolean inQueue(int val) {
  11. if (curQueueSize >= queueMaxSize) { //判断队列是否满了
  12. return false; //这里可以模仿线程池搞个拒绝策略,没能加入到队列的回头再处理
  13. }
  14. queue[curQueueSize] = val;
  15. curQueueSize++;
  16. return true;
  17. }
  18. /***出队*/
  19. public int outQueue() {
  20. int value = queue[0];
  21. curQueueSize--;
  22. queue[0] = 0;
  23. dataMove(); //当然这里可以搞算法优化,比如出队过半了或者满了之后再进行数据移动,而不是每次出队都进行数据移动
  24. return value;
  25. }
  26. /***移动队列数据*/
  27. public boolean dataMove() {
  28. for (int i = 0; i < queueMaxSize - 1; i++) {
  29. queue[i] = queue[i + 1];
  30. }
  31. return true;
  32. }
  33. /***打印*/
  34. public void print() {
  35. for (int i = 0; i < queueMaxSize; i++) {
  36. System.out.println(i + ":" + queue[i]);
  37. }
  38. }
  39. }