class MyCircularDeque {
size: number
available: number
left: number
right: number
arr: number[]
constructor(k: number) {
this.size = k
this.available = k
this.arr = Array.from({ length: k }, () => 0)
this.left = 0
this.right = 0
}
fix() {
if (this.available === this.size - 1) {
this.left = this.right
}
}
insertFront(value: number): boolean {
this.log()
if (this.available === 0) return false;
this.left = this.left + this.size - 1
this.available--
this.arr[this.left % this.size] = value
if (this.available === this.size - 1) {
this.right = this.left
}
return true
}
insertLast(value: number): boolean {
this.log()
if (this.available === 0) return false;
this.right++
this.available--
this.arr[this.right % this.size] = value
if (this.available === this.size - 1) {
this.left = this.right
}
return true
}
deleteFront(): boolean {
this.log()
if (this.available >= this.size) return false
this.left++;
this.available++;
return true
}
deleteLast(): boolean {
this.log()
if (this.available >= this.size) return false
this.right--;
this.available++;
return true
}
getFront(): number {
if (this.isEmpty()) return -1
this.log()
return this.arr[this.left % this.size]
}
log() {
// const { size, available, arr, left, right } = this
// console.log({
// size, available, arr, left, right
// })
}
getRear(): number {
if (this.isEmpty()) return -1
this.log()
return this.arr[this.right % this.size]
}
isEmpty(): boolean {
return this.available === this.size
}
isFull(): boolean {
return this.available === 0
}
}
/**
* Your MyCircularDeque object will be instantiated and called as such:
* var obj = new MyCircularDeque(k)
* var param_1 = obj.insertFront(value)
* var param_2 = obj.insertLast(value)
* var param_3 = obj.deleteFront()
* var param_4 = obj.deleteLast()
* var param_5 = obj.getFront()
* var param_6 = obj.getRear()
* var param_7 = obj.isEmpty()
* var param_8 = obj.isFull()
*/