本博客是学习韩顺平老师的数据结构与算法教程后记录的
上述队列存在的明显问题就是数组只能使用一次,使用算法,将数组优化成环形队列(采用取模%的方式) 可以简单类比成钟表,方便理解
class ArrayQueue2 { /** * 队列头,指向队列的第一个元素,array[front]就是队列的第一个元素 */ private int front; /** * 队列尾,指向队列的最后一个元素的后一个位置 */ private int rear; /** * 数组总长度 */ private int maxSize; /** * 数组 */ private int[] array; /** * desc : 初始化队列 * create_user : cheng * create_date : 2020/6/30 14:49 */ public ArrayQueue2(int maxSize) { // 数组的总长度要比实际传入的队列大小+1,因为采用这种方式时,rear尾指针所指向的位置总是空的 maxSize++; this.maxSize = maxSize; array = new int[maxSize]; } /** * desc : 判断队列是否已满 * create_user : cheng * create_date : 2020/6/30 14:19 */ public boolean isFull() { // 如果尾指针下一个元素就是front,那么说明队列已满,实际上这个时候队列还是有一个空的位置 return (rear + 1) % maxSize == front; } /** * desc : 判断队列是否为空 * create_user : cheng * create_date : 2020/6/30 14:20 */ public boolean isEmpty() { return front == rear; } /** * desc : 添加一个元素 * create_user : cheng * create_date : 2020/6/30 14:20 */ public void addQueue(int item) { // 判断队列是否已满 if (isFull()) { System.out.println("队列已满,添加失败"); return; } // 没满就添加数据 array[rear] = item; // 后移尾指针 rear = (rear + 1) % maxSize; } /** * desc : 获取一个元素 * create_user : cheng * create_date : 2020/6/30 14:22 */ public int getQueue() { // 判断队列是不是空的 if (isEmpty()) { throw new RuntimeException("队列为空"); } // 获取队列的第一个元素 int value = array[front]; // 后移头指针 front = (front + 1) % maxSize; // 返回元素 return value; } public int size() { // 尾指针位置 - 头指针位置 // 加上maxSize 防止模出负数 因为这是一个环形队列, 尾指针的值可能小于头指针的值 return (rear - front + maxSize) % maxSize; } }