mirror of
https://github.com/konvajs/konva.git
synced 2025-06-28 15:23:44 +08:00
93 lines
2.4 KiB
JavaScript
93 lines
2.4 KiB
JavaScript
export class circularQueue {
|
||
constructor(size) {
|
||
this.length = size
|
||
this.front = 0
|
||
this.tail = 0
|
||
this.current = 0
|
||
this.list = new Array(size)
|
||
}
|
||
|
||
get canMoveForward() {
|
||
// 能否后移
|
||
return (this.current + 1) % this.length !== this.tail
|
||
}
|
||
get canMoveBack() {
|
||
// current能否回退
|
||
return this.current !== this.front
|
||
}
|
||
|
||
clearAfterCurrent() {
|
||
let i = this.current
|
||
const length = this.length
|
||
|
||
while ((i + 1) % length !== this.tail) {
|
||
const clearIndex = (i + 1) % length
|
||
this.list[clearIndex] = undefined
|
||
i = clearIndex
|
||
}
|
||
this.tail = (this.current + 1) % this.length
|
||
}
|
||
|
||
// 入队
|
||
enqueue(item) {
|
||
// 当入队时current不是处于队尾指针的前驱时,需要清空current到队尾之间的所有元素,并重置尾指针
|
||
if (this.isFull() && (this.current + 1) % this.length !== this.tail) {
|
||
this.clearAfterCurrent()
|
||
}
|
||
|
||
if (this.isFull()) {
|
||
this.tail = (this.current + 1) % this.length
|
||
// 满了移动头指针
|
||
this.front = (this.front + 1) % this.length
|
||
}
|
||
this.list[this.tail] = item
|
||
this.current = this.tail
|
||
this.tail = (this.tail + 1) % this.length
|
||
}
|
||
|
||
// 不涉及
|
||
dequeue() {}
|
||
|
||
isEmpty = () => {
|
||
return typeof this.list[this.front] === 'undefined'
|
||
}
|
||
|
||
isFull = () => {
|
||
return (
|
||
this.front === this.tail &&
|
||
typeof this.list[this.front] !== 'undefined'
|
||
)
|
||
} // 队列满了
|
||
|
||
getCurrent() {
|
||
console.log('getCurrent', this.list[this.current])
|
||
return this.list[this.current]
|
||
}
|
||
|
||
// 往右移一步 (尾指针方向)
|
||
moveForward() {
|
||
if (this.canMoveForward) {
|
||
this.current = this.isFull()
|
||
? (this.current - 1 + this.length) % this.length
|
||
: this.current + 1
|
||
}
|
||
}
|
||
// 往左移一步 (头指针方向)
|
||
moveBack() {
|
||
if (this.canMoveBack) {
|
||
this.current = this.isFull()
|
||
? (this.current - 1 + this.length) % this.length
|
||
: this.current - 1
|
||
}
|
||
}
|
||
|
||
print() {
|
||
let i = 0
|
||
let p = this.front
|
||
while (i < this.length) {
|
||
console.log(this.list[p])
|
||
p = (p + 1) % this.length
|
||
i++
|
||
}
|
||
}
|
||
} |