先看一下这个循环队列的运作方式
现在可以看代码了(对照着途中的红字就可以理解isEmpty、isFull两个函数了 )
/**
* @param {number} k
*/
var MyCircularQueue = function(k) {
// 创建一个长度为k的数组
this.list = new Array(k)
// 用来存储数组的容量
this.maxLength = k
// 记录队首的位置
this.tou = 0
// 记录队尾的位置
this.wei = 0
};
/**
* @param {number} value
* @return {boolean}
*/
MyCircularQueue.prototype.enQueue = function(value) {
if(this.isFull()){
return false
}else{
this.list[this.wei] = value
// 假如数组长度是5 此队尾指向的是4 那么在插入新的值后队尾应该指向下标0 所以运用取余的方式来使下标回到0
this.wei = (this.wei+1)%this.maxLength
return true
}
};
/**
* @return {boolean}
*/
MyCircularQueue.prototype.deQueue = function() {
if(this.isEmpty()){
return false
}else{
this.list[this.tou] = null
// 假如数组长度是5 此队首指向的是4 那么在删除队首的值后队首应该指向下标0 所以运用取余的方式来使下标回到0
this.tou = (this.tou+1)%this.maxLength
return true
}
};
/**
* @return {number}
*/
MyCircularQueue.prototype.Front = function() {
if(this.isEmpty()){
return -1
}else{
return this.list[this.tou]
}
};
/**
* @return {number}
*/
MyCircularQueue.prototype.Rear = function() {
if(this.isEmpty()){
return -1
}else{
// 假如数组长度是5 并且此时队尾处于0 那说明真正的队尾在数组下标为4的地方
return this.list[(this.wei-1)<0?this.maxLength-1:this.wei-1]
}
};
/**
* @return {boolean}
*/
MyCircularQueue.prototype.isEmpty = function() {
// 记录队首队尾的值一样并且数组在此处的值已经为空了就代表数组已经空了
return this.tou==this.wei && !this.list[this.tou]
};
/**
* @return {boolean}
*/
MyCircularQueue.prototype.isFull = function() {
// 记录队首队尾的值一样并且数组在此处的值已经不为空就代表数组已经满了
return this.tou==this.wei && !!this.list[this.tou]
};
/**
* Your MyCircularQueue object will be instantiated and called as such:
* var obj = new MyCircularQueue(k)
* var param_1 = obj.enQueue(value)
* var param_2 = obj.deQueue()
* var param_3 = obj.Front()
* var param_4 = obj.Rear()
* var param_5 = obj.isEmpty()
* var param_6 = obj.isFull()
*/