题目简介
设计你的循环队列实现。环形缓冲区。
地址:https://leetcode-cn.com/problems/design-circular-queue/
思路简介
暂时不考虑线程并发,于是可以参考数据结构的环形队列。
基础啰嗦部分在这https://blog.csdn.net/Lian_wenwen233/article/details/120067411
- 题目要求的环形队列构造器参数是队列的有效数据的大小,所以采用韩顺平版本循环队列的实现时需要手动+1一下。
Rear()
函数需要注意的点是,rear指针始终指向队尾元素的下一个位置(取模的),所以可以计算一下当前有效元素个数。- 上面那条太烦了
- 直接if判断
rear==0
的情况,取队尾queue[maxSize-1]
,其他情况,直接取rear-1
即可(但如果要是遍历队列,那真的要算有效元素个数了)
代码
可以自行对比韩版数据结构,细微差别。甚至还简单了(笑)
public class MyCircularQueue {
private int front;
private int rear;
private int[] queue;
private int maxSize;
public MyCircularQueue(int k) {
maxSize = k + 1;
queue = new int[k + 1];
}
public boolean enQueue(int value) {
if (isFull()) {
return false;
}
queue[rear] = value;
rear = (rear + 1) % maxSize;
return true;
}
public boolean deQueue() {
if (isEmpty()) {
return false;
}
front = (front + 1) % maxSize;
return true;
}
public int Front() {
if (isEmpty()) {
return -1;
}
return queue[front];
}
public int Rear() {
if (isEmpty()) {
return -1;
}
if (rear == 0) {
return queue[maxSize - 1];
}
return queue[rear - 1];
}
public boolean isEmpty() {
return rear == front;
}
public boolean isFull() {
return (rear + 1) % maxSize == front;
}
}