携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
所谓题目越复杂,题型就越简单,恒古至今不变的定律
设计循环队列
该题出自力扣的622题 —— 设计循环队列【中等题】,有意思又简单的题目
审题
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
- 题意相对简单,虽然很大一串描述,就是自己实现一个循环队列
- 首先需要满足先进先出,也就是弹出头结点,新增尾节点
- 其次因为是循环队列,与顺序队列不一样的是,尾节点会不断后移,严格意义在头结点的后面,也在前面
- 按照题意的意思,不能使用内置库,那我们就尽量不使用LinkedList等链表
- 定义一个数组,充当存储容器;四个变量:头结点下标、尾节点下标、可用长度K,以及已存节点数num
- 因为是尾节点有可能在前面,所以需要使用(tail - 1) % k 计算出尾节点应该存储的位置
- 先进先出的含义,所以头结点弹出只需要头结点下标后移即可,尾节点会自行覆盖
编码
public MyCircularQueue(int k) {
a = new int[k];
head = tail = count = 0;
this.k = k;
}
int[] a;
int head,tail,count,k;
public boolean enQueue(int value) {
if (count == k){
return false;
}else {
count++;
a[tail % k] = value;
return ++tail >= 0;
}
}
public boolean deQueue() {
if (count == 0){
return false;
}else {
head++;
count--;
return true;
}
}
public int Front() {
if (count == 0){
return -1;
}
return a[head % k];
}
public int Rear() {
if (count == 0){
return -1;
}
return a[(tail - 1) % k];
}
public boolean isEmpty() {
if (count == 0) {
return true;
}
return false;
}
public boolean isFull() {
if (count == k) {
return true;
}
return false;
}