JS Queue 队列

队列

队列(queue)是遵循先进先出(First In First Out, FIFO)的一组有序的项目,队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。

队列
  • 队列是一种特殊的线性表,是一种操作受限的线性表。
  • 队列只能在队尾(rear)插入元素,在队首(front)删除元素。
  • 队列中无元素时称为空队列
  • 队列是一种先进先出(First-In-First-Out, FIFO)的数据结构

队列操作

顺序队列出队入队
  • 入队(enqueue):向队列中插入新元素,在队尾插入新元素。
  • 出队(dequeue):删除队列中的元素,删除对头的元素。
  • 读取(peek):读取对头的元素,返回对头元素。
  • 队头(front/head)
  • 队尾(end/rear)
  • 长度(size/length)
  • 清空(clear)
队列的插入和删除操作

队列机制

  • 操作系统中作业、进程和线程基于队列机制调度
  • 消息队列机制是在多个不同应用之间实现相互通信的一种异步传输模式

队列分类

  • 顺序队列:每次插入,指针rear+1,每次删除,指针front+1。
  • 循环队列

数组实现

栈使用top变量记录栈顶的位置,队列则使用front和rear分别标记队列第一个元素和最后一个元素的位置。

队列的数组实现
function Queue(){
    var items = [];

    this.enqueue = function(element){
        items.push(element);
    };
    this.dequeue = function(){
        return items.shift();
    };
    this.front = function(){
        return items[0];
    };
    this.end= function(){
        return items[items.length-1];
    };
    this.clear = function(){
        items = [];
    };
    this.isEmpty = function(){
        return items.length == 0;
    };
    this.size = function(){
        return items.length;
    };
    this.print = function(){
        console.log(items.toString());
    };
}
var queue = new Queue();
console.log(queue.isEmpty());//true

queue.enqueue('jack');
queue.enqueue('john');
queue.enqueue('camila');
queue.print();//jack,john,camila

console.log(queue.isEmpty());//false
console.log(queue.size());//3

console.log(queue.front());//jack
console.log(queue.end());//camila

queue.dequeue();
queue.print();//john,camila
队列操作

出队入队

队列实现

function enqueue(element){
    this.data.push(element);
}
function dequeue(){
    return this.data.shift();
}
function front(){
    return this.data[0];
}
function back(){
    return this.data[this.data.length-1];
}
function empty(){
    this.data.length==0;
}
function size(){
    return this.data.length;
}
function toString(){
    var string = '';
    for(var i=0; i<this.data.length; ++i){
        string += this.data[i]+'\n';
    }
    return string;
}
function Queue(){
    this.data = [];

    this.enqueue = enqueue;
    this.dequeue = dequeue;
    this.front = front;
    this.back = back;
    this.empty = empty;
    this.size = size;
    this.toString = toString;
}
/*test*/
var queue = new Queue();
queue.enqueue('meredith');
queue.enqueue('cynthia');
queue.enqueue('jennifer');
print(queue.toString());//meredith cynthia jennifer
print(queue.front());//meredith
print(queue.back());//jennifer

queue.dequeue();
print(queue.toString());//cynthia jennifer

方块舞分配

当男女来到舞池,按照性别排成两队。当舞池中有地方空出来时,选两个队列中的第一个人组成舞伴儿。他们身后的人各自向前移动一位,变成新的队首。当一堆舞伴儿迈入舞池时,主持人会大声喊出他们的名字。当一对舞伴儿走出舞池,且两排队伍中有任意一对没人时,主持人也会把这个情况告诉大家。


方块舞

方块舞人员清单

$ vim dancer.txt
F Allison McMillan
M Frank Opitz
M Mason McMillan
M Clayton Ruff
F Cheryl Ferenback
M Raymond Williams
F Jennifer Ingram
M Bryan Frazer
M David Durr
M Danny Martin
F Aurora Adney

基数排序

计算机刚出现时,程序是通过穿孔卡输入主机的,每张卡包含一条程序语句。这些穿孔卡装在一个盒子里,经过一个机械装置进行排序。这种排序基数叫做基数排序,参见Data Structures with C++(Prentice Hall)一书。

对于00~99的数字,基数排序将数据集扫描两次,第一次按个位上的数字排序,第二次按十位上的数字进行排序。每个数字根据对应位上的数值被分配在不同的盒子里。

假设有如下数字:91,46,85,15,92,35,31,22
经过基数排序第一次扫描后数字被分配到如下盒子中:
Bin0
Bin1:91,31
Bin2:92,22
Bin3
Bin4
Bin5:85,15,35
Bin6:46
Bin7
Bin8
Bin9
根据盒子的顺序,对数字第一次排序的结果是:91,31,92,22,85,15,35,46
然后根据十位上的数值再将上次排序的结果分配到不同的盒子中:
Bin0
Bin1:15
Bin2:22
Bin3:31,35
Bin4:46
Bin5
Bin6
Bin7
Bin8:85
Bin9:91,92
最后,将盒子中的数字取出,组成一个新列表,该列表即排序号的数字:15,22,31,46,85,91,92


基数排序

优先队列

一般情况下,从队列中删除的元素,一定是率先入队的元素。但也有一些使用队列的应用,在删除元素时,不必遵守先进先出的约定。这种应用需要使用一种叫做优先队列的数据结构来进行模拟。

优先队列

优先队列中元素的添加和移除是基于优先级的限制。

  • 机场登机的顺序中,头等舱和商务舱乘客优先级要高于经济舱乘客。
  • 医院急诊科候诊室,医生优先处理病情严重的患者,护士鉴别分类根据穿着病情严重程度放号。

实现队列优先有两种方式

  • 设置优先级,然后在正确的位置添加元素
  • 用入列操作添加元素,然后按照优先级移除他们。

循环队列

循环队列的一个列子是击鼓传花(HotPotato)

击鼓传花
循环队列出队入队
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 队列(Queue) 我们之前说到了栈,它是一种比较高效的数据结构,遵循 先入后出(LIFO,last-in-fir...
    Cryptic阅读 9,277评论 1 15
  • 课程介绍 先修课:概率统计,程序设计实习,集合论与图论 后续课:算法分析与设计,编译原理,操作系统,数据库概论,人...
    ShellyWhen阅读 2,244评论 0 3
  • 本文涉及更多的是概念,代码部分请参考之前写过的 2 篇博客 基于Javascript的排序算法基本数据结构和查找算...
    faremax阅读 1,207评论 0 2
  • 朋友圈里各种去过的地方,其实就是变着法儿的"到此一游"
    刘悠茸阅读 214评论 0 0
  • 想要什么样的生活就要向什么样的标准看齐,懒惰的一天,窝在床上什么也没有干了。突然感觉自己的宝宝像一个哲理家一样,之...
    黄凯爱蛋蛋阅读 141评论 0 0