javascript实现优先队列

简介: 1.概念     一般情况下从队列中删除元素,都是率先入队的元素。但是有些使用队列的情况不遵循先进先出的原则,这就是插队,这需要使用优选队列的数据结构来进行描述。     从优先队列中删除元素的时候,需要考虑优先级的限制。

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

输出结果为:

 

作者:Tyler Ning
出处:http://www.cnblogs.com/tylerdonet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过以下邮箱地址williamningdong@gmail.com  联系我,非常感谢。

目录
相关文章
|
JavaScript 前端开发
javascript深拷贝和浅拷贝以及实现方法(推荐)
javascript深拷贝和浅拷贝以及实现方法(推荐)
609 0
javascript深拷贝和浅拷贝以及实现方法(推荐)
|
JavaScript 算法 前端开发
【前端算法】JS实现数字千分位格式化
JS实现数字千分位格式化的几种思路,以及它们之间的性能比较
358 1
|
存储 前端开发 算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
172 0
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
|
存储 机器学习/深度学习 JavaScript
JS 你最少用几行代码实现深拷贝?
JS 你最少用几行代码实现深拷贝?
JS 你最少用几行代码实现深拷贝?
|
JavaScript 前端开发 算法
JavaScript实现一段时间之后关闭广告
简介:通过JavaScript实现在一段时间之后,广告消失。
140 0
JavaScript实现一段时间之后关闭广告
|
JavaScript 前端开发 算法
JS实现鼠标悬停变色
本文实现的是利用JS实现当鼠标悬停在表格上的时候,表格发生变色。 CSS渲染 JS逻辑 `
226 0
JS实现鼠标悬停变色
|
JavaScript 前端开发 数据安全/隐私保护
JS实现关闭图片窗口
通过事件的绑定来实现,关闭二维码的效果。
165 0
JS实现关闭图片窗口
|
前端开发 JavaScript Windows
js实现body背景图自动扩缩 光靠css几乎无法实现这样的效果
js实现body背景图自动扩缩 光靠css几乎无法实现这样的效果
207 0
js实现body背景图自动扩缩 光靠css几乎无法实现这样的效果
|
存储 JavaScript
js实现多选、全选、反选、取消选择(篇一)
js实现多选、全选、反选、取消选择(篇一)
409 0
|
JavaScript 前端开发
利用JavaScript实现二级联动
利用JavaScript实现二级联动 要实现JavaScript二级联动效果,首先要确定需要哪些技术: 二维数组 for in循环 new Option(text,value,true,true) add(option,null) onchange() 表单事件 HTML代码: &lt;!-- &lt;input type=&quot;text&quot; id=&quot;text&quot;&gt; --&gt; 请选择省份: &lt;select name=&quot;&quot; id=&quot;provinces&quot;&gt; &lt;!-- &lt;option value=&quot;江苏省&quot;&gt;江苏省&lt;/option&gt;