队列(Queue)

Posted haidnor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列(Queue)相关的知识,希望对你有一定的参考价值。

队列特点

  • 队列是一个有序列表,可以用数组或者链表实现
  • 遵循先进先出的特点,即先进入队列的数据,要先取出.后存入的数据后取出

例如小朋友排队打针,先排队的先打针,后排队的后打针,不准插队,不准谦让!!!

技术图片

 技术图片

 

  1 /**
  2  * 环形队列
  3  * @author Haidnor
  4  * @creat 2019-12-12-11:35
  5  */
  6 public class CircleQueue {
  7     private int front = -1;
  8     private int rear = -1;
  9     private int maxSize = 0;
 10     private Integer[] arr;
 11 
 12     public CircleQueue(int maxSize) {
 13         this.maxSize = maxSize;
 14         this.arr = new Integer[maxSize];
 15     }
 16 
 17     /**
 18      * Add data to the queue
 19      * @param num
 20      */
 21     public void add(int num){
 22         if(isEmpty()) {
 23             front = front + 1;
 24             arr[front] = num;
 25             rear ++;
 26         } else if(isFull()) {
 27             throw new RuntimeException("The queue is full and data cannot be added");
 28         } else {
 29             rear = (rear + 1) % maxSize;
 30             arr[rear] = num;
 31         }
 32     }
 33 
 34     /**
 35      * Get the header data from the queue
 36      * @return
 37      */
 38     public int get() {
 39         if(isEmpty()) {
 40             throw new RuntimeException("The queue is empty and the data cannot be retrieved");
 41         } else {
 42             if (front == rear & front + 1 == maxSize) {
 43                 int value = arr[front];
 44                 arr[front] = null;
 45                 front = rear = -1;
 46                 return value;
 47             } else if (front == rear & front == 0) {
 48                 int value = arr[front];
 49                 arr[front] = null;
 50                 front = rear = -1;
 51                 return value;
 52             } else {
 53                 int value = arr[front];
 54                 arr[front] = null;
 55                 front = (front + 1) % maxSize;
 56                 return value;
 57             }
 58         }
 59     }
 60 
 61     /**
 62      * Determines if the queue is empty
 63      * @return
 64      */
 65     public Boolean isEmpty() {
 66         return front == -1;
 67     }
 68 
 69     /**
 70      * Determine if the queue is full
 71      * @return
 72      */
 73     public Boolean isFull() {
 74         if (front == rear & rear == 0) {
 75             return false;
 76         } else if (rear + 1 == maxSize) {
 77             if (front == 0) {
 78                 return true;
 79             }
 80         } else if (rear + 1 == front) {
 81             return true;
 82         }
 83         return false;
 84     }
 85 
 86     public void show() {
 87         if (isEmpty()) {
 88             System.out.println("The queue is empty!");
 89             return;
 90         }
 91         if (rear == front | rear > front) {
 92             for (int i = front; i < arr.length; i++) {
 93                 System.out.printf("arr[%d]:%d
",i,arr[i]);
 94             }
 95         } else {
 96             for (int i = front; i < arr.length; i++) {
 97                 System.out.printf("arr[%d]:%d
",i,arr[i]);
 98             }
 99             for (int i = rear; i < front; i++) {
100                 System.out.printf("arr[%d]:%d
",i,arr[i]);
101             }
102         }
103     }
104 
105 }

 

 1 import java.util.Scanner;
 2 
 3 /**
 4  * @author Haidnor
 5  * @creat 2020-03-12-16:05
 6  */
 7 public class CircleQueueTest {
 8     public static void main(String[] args) {
 9         CircleQueue queue = new CircleQueue(5);
10 
11         Scanner scanner = new Scanner(System.in);
12         Boolean loop = true;
13         while (loop) {
14             System.out.println("
s(show): 查看队列");
15             System.out.println("a(add): 加入数据");
16             System.out.println("g(get): 取出数据");
17             System.out.println("e(exit): 退出程序");
18             System.out.print(">>> 请输入指令:");
19             char command = scanner.next().charAt(0);
20             switch (command) {
21                 case ‘s‘ :
22                     queue.show();
23                     break;
24                 case ‘a‘ :
25                     System.out.print(">>>输入数字:");
26                     try {
27                         int num = scanner.nextInt();
28                         queue.add(num);
29                     } catch (Exception e) {
30                         System.out.println(e.getMessage());
31                     }
32                     break;
33                 case ‘g‘ :
34                     try {
35                         int num = queue.get();
36                         System.out.println("取出的数字为:" + num);
37                     } catch (Exception e) {
38                         System.out.println(e.getMessage());
39                     }
40                     break;
41                 case ‘e‘ :
42                     scanner.close();
43                     loop = false;
44                     break;
45                 default :
46                     break;
47             }
48         }
49         System.out.println("已终止程序!");
50     }
51 }

 

以上是关于队列(Queue)的主要内容,如果未能解决你的问题,请参考以下文章

jQuery源代码解析—— ready载入queue队列

第三节2:Java集合框架之队列Queue

IPC - 消息队列(Message Queue)- 使用

IPC - 消息队列(Message Queue)- 使用

IPC - 消息队列(Message Queue)- 使用

IPC - 消息队列(Message Queue)- 使用