队列的应用场景
应用场景
银行排队,饭店点餐等等
队列介绍
- 队列是一个有序列表,可以用数组或链表来实现;
- 遵循先入先出的原则;(先进先出)
数组模拟队列的思路分析
数据模拟队列
思路分析
当我们将数据存入队列时称为addQueue,addQueue的处理需要两个步骤:
- 将尾指针往后移:rear+1,当front==rear (队列空)
- 托尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据。rear==maxSize-1 (队列满)
数组模拟队列的代码实现
数组模拟队列代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| package com.jokerdig.queue;
import java.util.Scanner;
public class Demo01 { public static void main(String[] args) { ArrayQueue arrayQueue = new ArrayQueue(3); char key; Scanner scanner = new Scanner(System.in); boolean flag = true; while(flag){ System.out.println("=============队列验证=============="); System.out.println("==========a: 添加队列============"); System.out.println("==========g: 获取队列============"); System.out.println("==========s: 查看队列============"); System.out.println("==========h: 查看队列头的数据============"); System.out.println("==========e: 退出程序============"); System.out.print("请输入对应的字符:"); key=scanner.next().charAt(0); switch (key){ case 'a': System.out.print("请输入一个数字:"); int val = scanner.nextInt(); arrayQueue.addQueue(val); break; case 'g': try { int res = arrayQueue.getQueue(); System.out.printf("取出的数据:%d\n",res); } catch (Exception e) { System.out.println(e.getMessage()); } break; case 's': arrayQueue.showQueue(); break; case 'h': try { int res = arrayQueue.headQueue(); System.out.printf("取出的头数据:%d\n",res); } catch (Exception e) { System.out.println(e.getMessage()); } break; case 'e': scanner.close(); flag = false; break; default: break; } } System.out.println("程序已退出");
} }
class ArrayQueue{ private int maxSize; private int front; private int rear; private int arr[];
public ArrayQueue(int arrMaxSize) { maxSize = arrMaxSize; arr = new int[maxSize]; front = -1; rear = -1; } public boolean isFull(){ return rear == maxSize-1; } public boolean isEmpty(){ return rear == front; } public void addQueue(int num){ if(isFull()){ System.out.println("队列已满,无法添加"); return; } rear++; arr[rear] =num; } public int getQueue(){ if(isEmpty()){ throw new RuntimeException("队列为空"); } front++; return arr[front]; } public void showQueue(){ if(isEmpty()){ System.out.println("队列为空"); return; } for (int i=0;i<arr.length;i++) { System.out.printf("arr[%d]=%d\n",i,arr[i]); } } public int headQueue(){ if(isEmpty()){ throw new RuntimeException("队列为空"); } return arr[front+1]; } }
|
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| =============队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:g 队列为空 =============队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:a 请输入一个数字:1 =============队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:s arr[0]=1 arr[1]=0 arr[2]=0 =============队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:a 请输入一个数字:2 =============队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:s arr[0]=1 arr[1]=2 arr[2]=0 =============队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:a 请输入一个数字:3 =============队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:s arr[0]=1 arr[1]=2 arr[2]=3 =============队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:a 请输入一个数字:4 队列已满,无法添加 =============队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:h 取出的头数据:1 =============队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:g 取出的数据:1 =============队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:e 程序已退出
Process finished with exit code 0
|
存在的问题
队列使用使用一次后,就无法为队列添加值!
数组模拟环形队列的思路分析
对数组模拟队列的优化,充分利用数组因此将数组看作是一个环形。(通过取模的方式来实现)
- 尾部索引的下一个为头索引时表示队列满,将队列容量作为约定,在做判断队列是否满的时候要注意(rear+1)%maxSize == front (满);
- rear == front (空);
- 这中情况下front和rear初始值默认为0;(而不是-1)
- 队列中有效的的数据个数(rear+maxSize-front)%maxSize
- 环形队列分析图;
数组模拟环形队列的实现
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
| package com.jokerdig.queue;
import java.util.Scanner;
public class Demo02 { public static void main(String[] args) { ArrayQueue1 arrayQueue = new ArrayQueue1(3); char key; Scanner scanner = new Scanner(System.in); boolean flag = true; while(flag){ System.out.println("=============环形队列验证=============="); System.out.println("==========a: 添加队列============"); System.out.println("==========g: 获取队列============"); System.out.println("==========s: 查看队列============"); System.out.println("==========h: 查看队列头的数据============"); System.out.println("==========e: 退出程序============"); System.out.print("请输入对应的字符:"); key=scanner.next().charAt(0); switch (key){ case 'a': System.out.print("请输入一个数字:"); int val = scanner.nextInt(); arrayQueue.addQueue(val); break; case 'g': try { int res = arrayQueue.getQueue(); System.out.printf("取出的数据:%d\n",res); } catch (Exception e) { System.out.println(e.getMessage()); } break; case 's': arrayQueue.showQueue(); break; case 'h': try { int res = arrayQueue.headQueue(); System.out.printf("取出的头数据:%d\n",res); } catch (Exception e) { System.out.println(e.getMessage()); } break; case 'e': scanner.close(); flag = false; break; default: break; } } System.out.println("程序已退出");
} }
class ArrayQueue1{ private int maxSize; private int front; private int rear; private int arr[];
public ArrayQueue1(int arrMaxSize) { maxSize = arrMaxSize; arr = new int[maxSize]; } public boolean isFull(){ return (rear+1)%maxSize==front; } public boolean isEmpty(){ return rear == front; } public void addQueue(int num){ if(isFull()){ System.out.println("队列已满,无法添加"); return; } arr[rear] =num; rear = (rear+1) % maxSize; } public int getQueue(){ if(isEmpty()){ throw new RuntimeException("队列为空"); }
int val = arr[front]; front = (front+1)%maxSize; return val; } public void showQueue(){ if(isEmpty()){ System.out.println("队列为空"); return; } for (int i=front; i<front+size();i++) { System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]); } }
public int size(){ return (rear+maxSize-front)%maxSize; }
public int headQueue(){ if(isEmpty()){ throw new RuntimeException("队列为空"); } return arr[front]; } }
|
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| =============环形队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:a 请输入一个数字:1 =============环形队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:s arr[0]=1 =============环形队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:a 请输入一个数字:2 =============环形队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:s arr[0]=1 arr[1]=2 =============环形队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:a 请输入一个数字:3 队列已满,无法添加 =============环形队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:s arr[0]=1 arr[1]=2 =============环形队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:g 取出的数据:1 =============环形队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:s arr[1]=2 =============环形队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:a 请输入一个数字:6 =============环形队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:s arr[1]=2 arr[2]=6 =============环形队列验证============== ==========a: 添加队列============ ==========g: 获取队列============ ==========s: 查看队列============ ==========h: 查看队列头的数据============ ==========e: 退出程序============ 请输入对应的字符:e 程序已退出
Process finished with exit code 0
|