| 队列是一个有序列表,可以用数组或是链表来实现。 |
| 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出 |
| |
| 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。 |
| 因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear 则是随着数据输入而改变 |

| 数组模拟队列 |
| 当我们将数据存入队列时称为”addQueue”,addQueue 的处理需要有两个步骤 |
| 将尾指针往后移:rear+1 , 当 front == rear 【空】 |
| 若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入 rear 所指的数组元素中,否则无法存入数据。rear == maxSize - 1[队列满] |
| import java.util.Scanner; |
| |
| public class ArrayQueueDemo { |
| |
| public static void main(String[] args) { |
| |
| |
| ArrayQueue queue = new ArrayQueue(3); |
| char key = ' '; |
| Scanner scanner = new Scanner(System.in); |
| boolean loop = true; |
| |
| while(loop) { |
| System.out.println("s(show): 显示队列"); |
| System.out.println("e(exit): 退出程序"); |
| System.out.println("a(add): 添加数据到队列"); |
| System.out.println("g(get): 从队列取出数据"); |
| System.out.println("h(head): 查看队列头的数据"); |
| key = scanner.next().charAt(0); |
| switch (key) { |
| case 's': |
| queue.showQueue(); |
| break; |
| case 'a': |
| System.out.println("输出一个数"); |
| int value = scanner.nextInt(); |
| queue.addQueue(value); |
| break; |
| case 'g': |
| try { |
| int res = queue.getQueue(); |
| System.out.printf("取出的数据是%d\n", res); |
| } catch (Exception e) { |
| |
| System.out.println(e.getMessage()); |
| } |
| break; |
| case 'h': |
| try { |
| int res = queue.headQueue(); |
| System.out.printf("队列头的数据是%d\n", res); |
| } catch (Exception e) { |
| |
| System.out.println(e.getMessage()); |
| } |
| break; |
| case 'e': |
| scanner.close(); |
| loop = 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 n) { |
| |
| if (isFull()) { |
| System.out.println("队列满,不能加入数据~"); |
| return; |
| } |
| rear++; |
| arr[rear] = n; |
| } |
| |
| |
| 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]; |
| } |
| } |
| 目前数组使用一次就不能用, 没有达到复用的效果 |
| 将这个数组使用算法,改进成一个环形的队列 取模: |
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术