大体思路记得,但是具体细节有遗忘,可以参考:循环队列中判断队满与队空_循环队列判断队空和队满-CSDN博客
题目
代码都是自己写的,Debug 也是。
/**
普通队列约定:
1. hh == tt队空;但是容量有限
2. 元素入队尾指针 q[tt++] = val ; 队头元素,q[hh]; 出队元素头指针 ++hh;
循环队列
1. 队满 hh == (tt + 1) % Q_size; //留一个位置判定满元素
2. 队空 hh == tt;
*/
class MyCircularQueue {
//设计一个循环队列,一个空间用来存放两指针的交界,判断是为空还是满
int[] MyQueue;
int hh = 0, tt = 0;
int size = 0 ; //存元素个数
int MAX_SIZE = 0;
public MyCircularQueue(int k) {
MyQueue = new int[k + 1];
MAX_SIZE = k + 1; //用来取模的队列长度; 注意是k + 1,因为一个位置要拿来取模
}
//元素入队
public boolean enQueue(int value) {
if(isFull()) return false;
MyQueue[tt] = value; //入队
tt = (tt + 1) % MAX_SIZE; //更新指针
size++; //更新容量
return true;
}
//元素删除; 删除头部元素
public boolean deQueue() {
if(isEmpty()) return false; //队空,删除失败
hh = (hh + 1) % MAX_SIZE;
size--; //更新容量
return true;
}
public int Front() {
if(isEmpty()) return -1; //队空,弹出元素失败
return MyQueue[hh];
}
public int Rear() {
if(isEmpty()) return -1; //队空,弹出元素失败
return MyQueue[(tt - 1 + MAX_SIZE) % MAX_SIZE]; //队尾稍微不太一样,因为可能会在0的位置,但是此时队列并空,所以要求和取模
}
//判定队空
public boolean isEmpty() {
return hh == tt;
}
//判定队满
public boolean isFull() {
return (tt + 1) % MAX_SIZE == hh;
}
}