队列
package com.caq.java; import org.junit.Test; import java.util.Scanner; /** * 循环队列的实现(数组) * * @Date 2021/12/8 11:16 * @Version 1.0 */ public class CircleArrayQueueDemo { public static void main(String[] args) { //创建环形队列 CircleArray circleArray = new CircleArray(3); Scanner sc = new Scanner(System.in); boolean loop = true; char key = ' '; while (loop) { System.out.println("Please input s、e、a、g、h"); System.out.println("s显示队列"); System.out.println("e退出程序"); System.out.println("a添加数据"); System.out.println("g取出数据"); System.out.println("h查看队列头的数据"); key = sc.next().charAt(0); switch (key) { case 's': circleArray.showQueue(); break; case 'e': sc.close(); loop = false; break; case 'a': System.out.println("请输入你要添加的数:"); int a = sc.nextInt(); circleArray.addQueue(a); break; case 'g': try { int queue = circleArray.getQueue(); System.out.println("取出的数是" + queue); } catch (Exception e) { System.out.println(e.getMessage()); } break; case 'h': try { int i = circleArray.headQueue(); System.out.println("头数据为:" + i); } catch (Exception e) { System.out.println(e.getMessage()); } break; default: break; } } } } class CircleArray { private int maxSize;//表示数组的最大容量 /** * 1. front变量的含义做一个调整:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素front的初始值=0 * 2. rear变量的含义做一个调整:rear指向队列的最后一个元素的后一个位置.因为希望空出一个空间做为约定.rear的初始值=0 */ private int front;//队列头 private int rear;//队列尾 private int[] arr;//模拟队列 //初始化数组 public CircleArray(int maxSize) { this.maxSize = maxSize; arr = new int[maxSize]; } //判断是否为满 public boolean isFull() { return (rear + 1) % maxSize == front; } //判断是否空 public boolean isEmpty() { return rear == front; } //往数列添加元素 public void addQueue(int n) { if (isFull()) { System.out.println("队列满了,不能添加了"); return; } //直接加入 arr[rear] = n; rear = (rear + 1) % maxSize; } //获取队列的数据,出队列 public int getQueue() { //判断队列是否为空 if (isEmpty()) { //通过抛出异常 throw new RuntimeException("队列空,不能取数据"); } /** 这里需要分析出front是指向队列的第一个元素 1.先把front对应的值保留到一个临时变量 2.将front后移,考虑取模 3.将临时保存的变量返回 */ int value = arr[front]; front = (front + 1) % maxSize; return value; } //显示队列的所有数据 public void showQueue() { //遍历 if (isEmpty()) { System.out.println("队列空的,没用数据"); return; } for (int i = front; i < front + size(); i++) { System.out.println("arr" + "[" + i + "]" + "=" + arr[i % maxSize]); } } //求当前队列的有效数据 public int size() { return (rear + maxSize - front) % maxSize; } //显示队列的头数据 public int headQueue() { //判断 if (isEmpty()) { throw new RuntimeException("队列空,没用数据"); } return arr[front]; } }