JS队列的应用与案例

28 阅读1分钟

1. 概念

  • 线性表,只允许在一端进行插入,另一端进行删除操作;
  • 先进先出,插入的一端为【队尾】rear,删除的一端为【队首】front,插入称之为进队,删除称之为出队;
  • 删除队首之后,其后继元素成为队头;

2. 操作与实现

  • enqueue() 尾部添加一项;
  • dequeue() 头部删除一项;
  • front() 返回队列第一项;
  • isEmpty() 是否为空;
  • size() 返回队列长度;
function Queue() {
    // 模拟队列
    let items = [];
    // 尾部插入
    this.enqueue = function(element) {
        items.push(element);
    }
    // 头部移出
    this.dequeue = function() {
        return items.shift()
    }
    // 返回第一项
    this.front = function() {
        return item[0];
    }
    // 是否为空
    this.isEmpty = function() {
        return items.length === 0
    }
    // 队列长度
    this.size = function() {
        return items.length;
    }
    // 打印
    this.print = function() {
        const res = items.toString();
        console.log(res)
    }
}

let queueIns = new Queue();
queueIns.enqueue(2)
queueIns.enqueue(3)
queueIns.enqueue(4)
queueIns.enqueue(5)
queueIns.enqueue(6)
queueIns.print()

3. 实践与应用--优先队列

【概念】

对列表中的每个元素都有各自的优先级,在插入的时候会根据优先级的高低顺序进行插入操作;

【规则】

优先码的值最小的元素优先级最高

【思路】

入队时,如果队列为空,则直接加入队列,否则进行比较;

priority最小的优先级最高,优先级越高放在队列的越前面;

function PriorityQueue() {
    let items = [];
    // 队列元素,多定义一个优先级变量
    function QueueElement(element, priority) {
        this.element = element;
        this.priority = priority;
    }
    // 队列新增方法
    this.enqueue = function(element, priority) {
        // 通过比对值的大小,对队列中 的元素进行 一个调换
        let queueElement = new QueueElement(element, priority);
        // case1 队列中已经包含元素
        let added = false
        for (let i = 0; i < items.length; i++) {
            if (queueElement.priority < items[i].priority) {
                items.splice(i, 0, queueElement);
                added = true;
                break;
            }
        }
        // case2 队列中不包含元素
        if (!added) {
            items.push(queueElement);
        }
    }

    // 移出队列第一项
    this.dequeue = function() {
        return items.shift();
    }
    this.front = function() {
        return item[0];
    }
    this.isEmpty = function() {
        return items.length === 0
    }
    this.size = function() {
        return items.length;
    }
    this.print = function() {
        for (let i = 0; i < items.length; i++) {
            console.log(`${items[i].priority}=>${items[i].element}`)
        }
    }
}

let priorityQueue = new PriorityQueue();
priorityQueue.enqueue('a', 3)
priorityQueue.enqueue('b', 2)
priorityQueue.enqueue('c', 1)
priorityQueue.print() 
// 1=>c
// 2=>b
// 3=>a