zoukankan      html  css  js  c++  java
  • javascript实现优先队列

    1.概念

        一般情况下从队列中删除元素,都是率先入队的元素。但是有些使用队列的情况不遵循先进先出的原则,这就是插队,这需要使用优选队列的数据结构来进行描述。

        从优先队列中删除元素的时候,需要考虑优先级的限制。比如医院急诊科的例子就是一个典型的优先队列的例子。当病人进入急诊室的时候,护士先根据病情给一个优先级代码,高优先级的患者先于低优先级的患者就医,优先级相同的根据先来先服务的顺序就医。

        定义存储队列元素的对象,然后构建优先队列数据结构。    

    function Patient(name, code) {
        this.name = name;
        this.code = code;
    }

        变量code是一个整数,标识患者优先级或者病情验证程度,规定优先级代码越小优先级越高。新的dequeue() 方法遍历队列的底层存储数组,从中找出优先码最低的元素,然后使用数组的splice() 方法删除优先级最高的元素。新的dequeue() 方法定义如下所示:

    function dequeue(){
        var priority = this.dataStore[0].code;
        var fromIndex = 0;
        for (var i=1; i<this.dataStore.length; ++i) {
            if (this.dataStore[i].code < priority) {
                fromIndex = i;
            }
        }
        return this.dataStore.splice(fromIndex, 1);
    }

        dequeue() 方法使用简单的顺序查找方法寻找优先级最高的元素(优先码越小优先级越高,比如,1 比5 的优先级高)。该方法返回包含一个元素的数组——从队列中删除的元素。

    2.代码实现

        完整的代码如下所示: 

    /*--------------Queue类的定义和测试代码----------------*/
    function Queue(){
            this.dataStore = [];
            this.enqueue = enqueue;
            this.dequeue = dequeue;
            this.front = front;
            this.back = back;
            this.toString = toString;
            this.empty = empty;
    }
    
    //入队,就是在数组的末尾添加一个元素
    function enqueue(element){
        this.dataStore.push(element);
    }
    //出队,判断优先级删除,注意这里用的是数组的splice方法,不是slice方法
    function dequeue(){
        var priority = this.dataStore[0].code;
        var fromIndex = 0;
        for (var i=1; i<this.dataStore.length; ++i) {
            if (this.dataStore[i].code < priority) {
                fromIndex = i;
            }
        }
        return this.dataStore.splice(fromIndex, 1);
    }
    //取出数组的第一个元素
    function front(){
        return this.dataStore[0];
    }
    //取出数组的最后一个元素
    function back(){
        return this.dataStore[this.dataStore.length-1];
    }
    
    function toString(){
        var retStr = "";
        for (var i=0; i<this.dataStore.length; ++i) {
            retStr += "病人:" + this.dataStore[i].name + " 优先级:" + this.dataStore[i].code + "<br>"
        }
        return retStr;
    }
    //判断数组是否为空
    function empty(){
        if(this.dataStore.length == 0){
            return true;
        }else{
            return false;
        }    
    }
    //返回数组中元素的个数
    function count(){
        return this.dataStore.length;
    }
    
    /*----------------基数排序-----------------*/
    
    
    function Patient(name, code){
        this.name = name;
        this.code = code;
    }
    var p = new Patient('smith', 5);
    var ed = new Queue();
    ed.enqueue(p);
    
    p = new Patient('jones', 4);
    ed.enqueue(p);
    
    p = new Patient('fehrendbach', 6);
    ed.enqueue(p);
    
    p = new Patient('brown', 1);
    ed.enqueue(p);
    
    p = new Patient('ingram', 1);
    ed.enqueue(p);
    
    document.write(ed.toString());
    
    var seen = ed.dequeue();
    document.write('<br>');
    document.write("服务病人:" + seen[0].name);
    
    document.write('<br>');
    document.write(ed.toString());
    
    seen = ed.dequeue();
    document.write('<br>');
    document.write("服务病人:" + seen[0].name);
    
    document.write('<br>');
    document.write(ed.toString());
    
    
    seen = ed.dequeue();
    document.write('<br>');
    document.write("服务病人:" + seen[0].name);
    
    document.write('<br>');
    document.write(ed.toString());

    输出结果为:

  • 相关阅读:
    codevs 2632 非常好友
    codevs 1213 解的个数
    codevs 2751 军训分批
    codevs 1519 过路费
    codevs 1503 愚蠢的宠物
    codevs 2639 约会计划
    codevs 3369 膜拜
    codevs 3135 River Hopscotch
    数论模板
    JXOJ 9.7 NOIP 放松模拟赛 总结
  • 原文地址:https://www.cnblogs.com/tylerdonet/p/5844080.html
Copyright © 2011-2022 走看看