队列是一种先进先出的数据结构,本篇文章使用数组来实现队列
public class ArrayQueue{ private int maxSize; //表示数组的最大容量(即队列的最大容量) private int front; //队列的头 private int rear; //队列的尾 private T[] data; //用于存放数据 public ArrayQueue(int capacity) { this.maxSize = capacity; //容量 this.front = -1; //默认值为-1 this.rear = -1; //默认值为-1 data = (T[]) new Object[maxSize]; } public boolean isFull() { return rear == maxSize - 1; } public boolean isEmpty() { return rear == front; } public void add(T element) { if(isFull()) { System.out.println("队列已满"); return; } rear++; //添加元素,让rear(尾巴)后移1位,本来为-1,此时为0 data[rear] = element; //data[0] = element,此时rear已经为0,不再是-1 } public T get() { if(isEmpty()) { System.out.println("队列为空"); return; } front++; //去除元素,让front(头)后移1位,本来为-1,此时为0 return data[front]; //return data[0] } public void show() { if(isEmpty()) { System.out.println("队列为空"); return; } for(T element : data) { System.out.printf(element); } } }
上面虽然实现了队列,但是有缺陷,无法循环利用,下面是循环队列的实现
public class CircleArrayQueue{ private int maxSize; //最大容量 private int front; //队列头部,默认为0 private int rear; //队列尾部,默认为0 private T[] data; //用于存放数据 public CircleArrayQueue(int capacity) { this.maxSize = capacity; data = (T[]) new Object[maxSize]; } public boolean isFull() { return (rear + 1) % maxSize == front; } public boolean isEmpty() { return rear == front; } // 添加数据到队列 public void add(T element) { // 判断队列是否满 if (isFull()) { System.out.println("队列满,不能加入数据~"); return; } //直接将数据加入 data[rear] = element; //将 rear 后移, 这里必须考虑取模 rear = (rear + 1) % maxSize; } // 获取队列的数据, 出队列 public int get() { // 判断队列是否空 if (isEmpty()) { // 通过抛出异常 throw new RuntimeException("队列空,不能取数据"); } // 这里需要分析出 front是指向队列的第一个元素 // 1. 先把 front 对应的值保留到一个临时变量 // 2. 将 front 后移, 考虑取模 // 3. 将临时保存的变量返回 int value = data[front]; front = (front + 1) % maxSize; return value; } // 显示队列的所有数据 public void show() { // 遍历 if (isEmpty()) { System.out.println("队列空的,没有数据~~"); return; } // 思路:从front开始遍历,遍历多少个元素 // 动脑筋 for (int i = front; i < front + size() ; i++) { System.out.printf("arr[%d]=%dn", i % maxSize, arr[i % maxSize]); } } // 求出当前队列有效数据的个数 public int size() { // rear = 2 // front = 1 // maxSize = 3 return (rear + maxSize - front) % maxSize; } }



