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());
输出结果为:

javascript实现优先队列的更多相关文章
- javascript数据结构-优先队列
这里之所以扩充一个 有限队列 是因为,生活使用中队列通常会附加优先级,比如排队买票,一般老人和军人等会有优先权限. 实现:继承上篇的 普通队列实现.这里用一种方法,入队的时候,进行排序插入到指定位置, ...
- 使用 JavaScript 实现基本队列、优先队列和循环队列
1.基本队列的实现 基本队列的方法中,包含了 ①向队列(尾部)中添加元素(enqueue).②(从队列头部)删除元素(dequeue).③查看队列头部的元素(front).④查看队列是否为空(isEm ...
- Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法
前言 队列和栈非常类似,前面已经讲过了栈的实现与用法,现在我们来说说队列. 队列介绍 队列遵循FIFO(First In First Out,先进先出)原则的一组有序的项. 队列是一种特殊的线性表,特 ...
- JavaScript数据结构-6.优先队列
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- javascript的队列,优先队列,循环队列
按书上的来弄的.慢慢理解了. function Queue() { var items = []; this.enqueue = function(element){ items.push(eleme ...
- 《数据结构与算法JavaScript描述》
<数据结构与算法JavaScript描述> 基本信息 作者: (美)Michael McMillan 译者: 王群锋 杜欢 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9 ...
- 第五章:javascript:队列
队列是一种列表,不同的是队列只能在末尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据.先进先出.这点和栈不一样,在栈中,最后入栈的元素反被优先处理.可以将队列想象成银行排队办理业务的人,排队在 ...
- Javascript用数组实现栈和队列
栈是遵循后进先出(LIFO)规则的一种有序集合,比如桌上的一叠书,我们只能从上面放或取. 队列是遵循先进先出(FIFO)规则的一种有序集合,比如排队,先排到的先离开. 数组也是一种有序的集合,它与上面 ...
- JavaScript 版数据结构与算法(二)队列
今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历 ...
随机推荐
- Android C代码回调java方法
本文将讲述下列三种C代码回调java方法 1.c代码回调java空方法 2.c代码回调java int类型参数方法 3.c代码回调javaString类型参数方法 方法都差不多,先看c代码回调java ...
- 让我们喝喝下午茶,聊聊AJAX和JSON
1.AJAX [1] AJAX简介 > 全称:Asynchronous JavaScript And XML > 直译:异步的JavaScript和 ...
- DevExpress ASPxSplitter ClientSideEvents-PaneExpanded 时间用法
在webform中的devexpress aspxsplitter中套用了jquery-easyui的 tabs id=tt <div id="tt" class=" ...
- js:插入节点appendChild insertBefore使用方法
首先 从定义来理解 这两个方法: appendChild() 方法:可向节点的子节点列表的末尾添加新的子节点.语法:appendChild(newchild) insertBefore() 方法:可在 ...
- sysbench测试工具
sysbench简介 Sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.它主要包括以下几种方式的测试:cpu性能,磁盘io性能,线程调度性 ...
- SQL Server中字符串转化为GUID的标量函数实现
还是工作中遇到的需求,有时候和外部的系统对接,进行数据的核对功能,外部的系统有时候主键字段列数据类是UNIQUEIDENTIFER(GUID)类型的字符串格式,去除了GUID格式中的分隔符“- ...
- 新手开发android容易出现的错误(不断更新中...)
才开始开发android app,因为以前一直是java开发,学习也比较容易. 记录下自己开发过程中出现的一些小问题: 静态变量 在开发中,因为习惯性的问题,经常将一些常用数据(如用户信息等)进行st ...
- linux下mysql开启远程访问权限及防火墙开放3306端口
默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限. 主流的有两种方法,改表法和授权法. 相对而言,改表法比较容易一点,个人也是比 ...
- Softmax回归(Softmax Regression)
转载请注明出处:http://www.cnblogs.com/BYRans/ 多分类问题 在一个多分类问题中,因变量y有k个取值,即.例如在邮件分类问题中,我们要把邮件分为垃圾邮件.个人邮件.工作邮件 ...
- linux下怎么查看ssh的用户登录日志
linux下登录日志在下面的目录里: cd /var/log 查看ssh用户的登录日志: less secure linux日志管理: 1. 日志简介 日志对于安全来说,非常重要,他记录了系统每天发生 ...