数组实现循环队列

数组实现循环队列:数组实现循环队列,这里的关键之处就在于使用取余将出入队操作维护在一个有限的空间内,本质上数据存储也维护了之前操作的所有数据,这里是无限的空间利用。

/**
 * 数组实现循环队列
 * 

* 这里环形的关键就在于使用 % 实现了循环 *

* 这里的 front 和 rear 都可能超过 maxSize,实际使用的数据都是后边的。但是所有入队的数据都会存储下来 * * @author wangjiangbo * @email [email protected] * @date 2023/4/2 21:55 */ public class CircleArrayQueue { /** * 队列大小【实际数据存储量为maxSize - 1,定义此变量为了标识队尾】 */ private int maxSize; /** * 队列头 */ private int front; /** * 队列尾 */ private int rear; /** * 数据源 */ private int[] source; /** * 构造方法初始化 * * @param maxSize */ public CircleArrayQueue(int maxSize) { this.maxSize = maxSize; source = new int[maxSize]; front = 0; rear = 0; } /** * 判断队列是否为空 * * @return */ public boolean isEmpty() { return front == rear; } /** * 判断队列是否已满 * * @return */ public boolean isFull() { // 以下关系成立时说明 rear 最后一个位置 return (rear + 1) % maxSize == front; } /** * 入队 * * @return */ public boolean enqueue(int element) { if (isFull()) { return false; } // 数据存储 source[rear] = element; // 体现循环性 rear = (rear + 1) % maxSize; return true; } /** * 出队 * * @return */ public int deQueue() { if (isEmpty()) { throw new IllegalStateException("队列为空,无法出队"); } // 先维护队首元素 int curVal = source[front]; // 指针后移 front = (front + 1) % maxSize; return curVal; } /** * 获取队列有效数据的大小 * * @return */ public int getValidSize() { return (rear + maxSize - front) % maxSize; } /** * 迭代队列 * * @return */ public int[] iterateQueue() { int validSize = getValidSize(); // 定义空间用于存储结果 int[] data = new int[validSize]; if (isEmpty()) { return new int[0]; } for (int i = 0; i < validSize; i++) { data[i] = source[(front + i) % maxSize]; } return data; } }

你可能感兴趣的:(2023,datastruct,java,数据结构)