一:数组形成队列
队列的特点是先进先出,如在银行排队办业务,食堂打饭都是先来先打。
数组实现队列,根据这个,我们需要front和rear属性来记录队列前后端的下标。
1:思路分析
-
队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图 , 其中 MaxS ize 是该队列的最大容量。
-
因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear 则是随着数据输入而改变,如图所示 :
当我们将数据存入队列时称为”addQueue”,addQueue 的处理需要有两个步骤:思路分析 1) 将尾指针往后移:rear+1 , 当 front == rear 【空】 2) 若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入 rear 所指的数组元素中,否则无法存入数据。 rear == maxSize - 1[队列满]
2:代码实现
ArrayQueue实体类
package com.queue; /** * @author lizhangyu * @date 2021/3/8 19:54 */ public class ArrayQueue { private int size; private int first; private int rear; private int[] arr; public ArrayQueue(int size) { this.size = size; this.arr = new int[size]; this.first = -1; this.rear = -1; } /** * 判断队列是否已经满了 * @return */ public boolean isFull() { return rear == size - 1; } /** * 判断队列是否为空 * @return */ public boolean isEmpty() { return rear == first; } public void addQueue(int n) { if (isFull()) { System.out.println("队列已经满了,不能加入数据了"); return; } rear++; arr[rear] = n; } /** * 获取队列首个数据并出队列 * @return */ public int getQueue() { if (isEmpty()) { System.out.println("队列为空"); } first++; return arr[first]; } /** * 获取队列首个数据但是不出队列 * @return */ public int headQueue() { if (isEmpty()) { System.out.println("队列为空"); } return arr[first+1]; } public void showQueue() { if (isEmpty()) { System.out.println("队列为空"); return; } for (int i = 0; i < arr.length; i++) { System.out.println("队列第" + (i + 1) + "个数据为:" + arr[i]); } } }
ArrayQueueDemo实体类
package com.queue; import java.util.Scanner; /** * @author lizhangyu * @date 2021/3/8 20:09 */ public class ArrayQueueDemo { public static void main(String[] args) { ArrayQueue arrayQueue = new ArrayQueue(10); String key = ""; Scanner scanner = new Scanner(System.in); while (true) { System.out.println("show: 显示队列"); System.out.println("add: 添加数据到队列"); System.out.println("get: 从队列中取出数据"); System.out.println("find: 查看队列头的数据"); System.out.println("exit: 退出系统"); key = scanner.next(); switch (key) { case "add" : System.out.println("请输入一个数"); int n = scanner.nextInt(); arrayQueue.addQueue(n); break; case "find" : int res = arrayQueue.headQueue(); System.out.println("从队列中取出数据为:" + res); break; case "get" : res = arrayQueue.getQueue(); System.out.println("从队列中取出数据为:" + res); break; case "show" : arrayQueue.showQueue(); break; case "exit" : scanner.close(); System.exit(0); default: break; } } } }