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());

    输出结果为:

  • 相关阅读:
    Android BroadcastAnyWhere(Google Bug 17356824)漏洞具体分析
    读写Word的组件DocX介绍与入门
    2015年终总结,忙碌与有所收获的一年,2016年继续努力!
    数据库题——高于部门平均工资查询问题
    Oracle 简单的列转行
    行香子&#183;过尽千山
    ZOJ2599:Graduated Lexicographical Ordering(很经典的数位DP)
    【oracle11g,18】存储结构:暂时表,手工条带化,表/索引迁移表空间,删除表,外部表
    联想S820 MIUI刷机包 MIUI 4.4.30 流畅执行 在线主题破解
    android开发艺术探索学习 之 结合Activity的生命周期了解Activity的LaunchMode
  • 原文地址:https://www.cnblogs.com/tylerdonet/p/5844080.html
Copyright © 2011-2022 走看看