链接👇
循环队列
题目要求:
思路:
我们使用10个元素大小的数组,实际上只使用9个。
使用数组,记录队头front和队尾rear,入队:elem[rear]放入元素,rear向后移动。
出队:front向后移动即可(12345元素入队,rear指向5元素的下一个位置,出队一次,front从1元素指向2元素位置).
图解👇
1.设置变量
int front = 0;
int rear = 0;
int[] elem;//数组实现
public MyCircularQueue(int k) {
this.elem = new int[k+1];//k+1 因为浪费掉一个数组格子 10个int大小的数组,只用9个
}
2.入队
public boolean enQueue(int value) {
if(isFull()){//为满
return false;
}
elem[rear] = value;
rear = (rear+1) % elem.length;//队尾到队头也可以执行(rear从0下标到1下标)
//(0+1)%5 = 1; (1+1)%5 = 2; (4+1)%5 = 0;完成了5到0的循环
return true;
}
3.出队
public boolean deQueue() {
if(isEmpty()){
return false;
}
front = (front+1) % elem.length;//队头从0走到1
return true;
}
4.返回队头和队尾元素
public int Front() {
if(isEmpty()){
return -1;
}
return elem[front];
}
public int Rear() {
if(isEmpty()){
return -1;
}
//如果队列不为空 但是rear == 0 ,如何返回rear的元素
return ((rear == 0) ? elem[elem.length-1] : elem[rear-1]);
}
5.判空和判满
public boolean isEmpty() {
return rear == front;
}
public boolean isFull() {
return (rear+1) % elem.length == front;
}
完整代码👇
class MyCircularQueue {
int front = 0;
int rear = 0;
int[] elem;//数组实现
public MyCircularQueue(int k) {
this.elem = new int[k+1];//k+1 因为浪费掉一个数组格子 10个int大小的数组,只用9个
}
public boolean enQueue(int value) {
if(isFull()){//为满
return false;
}
elem[rear] = value;
rear = (rear+1) % elem.length;//队尾到队头也可以执行(rear从0下标到1下标)
//(0+1)%5 = 1; (1+1)%5 = 2; (4+1)%5 = 0;完成了5到0的循环
return true;
}
public boolean deQueue() {
if(isEmpty()){
return false;
}
front = (front+1) % elem.length;//队头从0走到1
return true;
}
public int Front() {
if(isEmpty()){
return -1;
}
return elem[front];
}
public int Rear() {
if(isEmpty()){
return -1;
}
//如果队列不为空 但是rear == 0 ,如何返回rear的元素
return ((rear == 0) ? elem[elem.length-1] : elem[rear-1]);
}
public boolean isEmpty() {
return rear == front;
}
public boolean isFull() {
return (rear+1) % elem.length == front;
}
}
如果对你有帮助 一键三连!
运行结果👇