编辑代码

/*
有限优先级队列

适用对象:开发岗位

实现一个队列数据结构,支持对三种不同优先级任务的队列操作。
该结构应该提供两个公共接口,void Enqueue(item)和object Dequeue(),分别用于任务入队和出队操作。
该结构在执行出队操作时,应始终按优先级由高至低的顺序出队;对于优先级相同的任务,按队列的一般规则,先进先出。
任务定义可参考:
Task {
	Priority: High/Normal/Low (1/2/3),
	Data: (any content is good)
}

示例调用序列:
Enqueue({1, ‘a’})
Dequeue()
Enqueue({1, ‘a’})
Enqueue({2, ‘a’})
Dequeue()
Enqueue({3, ‘b’})
Enqueue({1, ‘b’})
Dequeue()
Enqueue({2, ‘b’})
Dequeue()
Dequeue()
Dequeue()

期待的返回结果序列:
{1, ‘a’}
{1, ‘a’}
{1, ‘b’}
{2, ‘a’}
{2, ‘b’}
{3, ‘b’} 

注意,以上返回结果序列,是按示例操作序列调用Dequeue()的返回结果,Dequeue()并不要求实现输出到控制台或其它设备的能力。
*/

class Queue {
    constructor() {
        this.highTasks = [];
        this.normalTasks = [];
        this.lowTasks = [];
    }

    Enqueue (item) {
        switch (item.priority) {
            case 1:
                this.highTasks.push(item);
                break;
            case 2:
                this.normalTasks.push(item);
                break;
            case 3:
                this.lowTasks.push(item);
                break;
            default:
        }
    }

    Dequeue () {
        let task;
        if (this.highTasks.length) {
            task = this.highTasks.shift();
        } else if (this.normalTasks.length) {
            task = this.normalTasks.shift();
        } else if (this.lowTasks.length) {
            task = this.lowTasks.shift();
        }
        console.log(`{${task.priority},${task.data}}`);
        return task;
    }
}

const queue = new Queue();

queue.Enqueue({ priority: 1, data: 'a' })
queue.Dequeue()
queue.Enqueue({ priority: 1, data: 'a' })
queue.Enqueue({ priority: 2, data: 'a' })
queue.Dequeue()
queue.Enqueue({ priority: 3, data: 'b' })
queue.Enqueue({ priority: 1, data: 'b' })
queue.Dequeue()
queue.Enqueue({ priority: 2, data: 'b' })
queue.Dequeue()
queue.Dequeue()
queue.Dequeue()