接下来会借助本人另一篇文章JavaScript数据结构与算法——队列详解(上)中实现的队列类及其方法实现一个应用。

配对问题

需求分析:在一个文件中保存着一份男女混合的数据,名称前以B开头表示男士,以G开头表示女士,将文件中的男女读出来,分别放进一个队列,两两配对(比如排成两队,相对的匹配男女朋友),直至有一方人数为0,若刚好双双配对成功,则显示“全部配对完成”,若有人没配对成功,则显示没配对成功的人的性别及其名称。

文件准备

准备一份包含男女的文件,本人准备的是people.txt,内容格式如下:

G 小花1
G 小花2
B 小明1
B 小明2
B 小明3
B 小明4
G 小花3
B 小明5
G 小花4
B 小明6
G 小花5

定义Person对象,保存待匹配者信息

function Person(name, sex) {this.name = namethis.sex = sex
}

读取文件,分配入队

读取文件我们可以借助nodejs的文件系统fs读取文件,然后使用字符串、数组之间的转换函数实现人名的分割,随后按男女保存到各自的队列中。

function getPerson(boysQueue, girlsQueue) {// 读取包含性别的名字var names = fs.readFileSync('people.txt')// 分行保存var namesArray = names.toString().split('\n')// 取出末尾空格for (var i = 0; i < namesArray.length; i++) {namesArray[i] = namesArray[i].trim()}// 性别与名称分割,并按性别入队for (var i = 0; i < namesArray.length; i++) {var sexAndName = namesArray[i].split(' ')var sex = sexAndName[0]var name = sexAndName[1]if (sex === 'B') {boysQueue.enQueue(new Person(name, sex))} else {girlsQueue.enQueue(new Person(name ,sex))}}
}

实现配对方法

function match(boysQueue, girlsQueue) {var currBoy, currGirlwhile (!boysQueue.empty() && !girlsQueue.empty()) {currBoy = boysQueue.deQueue()currGirl = girlsQueue.deQueue()console.log(currBoy.name + '与' + currGirl.name + '配对成功啦!!!')}if (boysQueue.count() > 0) {console.log('有' + boysQueue.count() + '个男士缺少女士配对!!')}if (girlsQueue.count() > 0) {console.log('有' + girlsQueue.count() + '个女士缺少男士配对!!')}if ((girlsQueue.count() === 0) && (boysQueue.count() === 0)) {console.log('恭喜!!刚好全部配对完毕,不存在有人单身啦!!!')}
}

这个比较简单,就不注释了,有疑问的话研究一下代码就能理解。

测试用例

var boysQueue = new Queue()
var girlsQueue = new Queue()
getPerson(boysQueue, girlsQueue)
match(boysQueue, girlsQueue)

与上篇代码整合后的完整代码queue.js如下

// Created by xiaoqiang on 07/04/2018.
var fs = require('fs')
function Queue() {this.data = []            // 存放数据this.enQueue = enQueue    // 入队操作this.deQueue = deQueue    // 出队操作this.first = first        // 访问第一个元素this.last = last          // 访问最后一个元素this.toString = toString  // 显示队列中的数据this.empty = empty        // 清空队列数据this.count = count        // 显示队列当前元素数量
}function enQueue(param) {this.data.push(param)return this
}function deQueue() {return this.data.shift()
}function first() {return this.data[0]
}function last() {return this.data[this.data.length - 1]
}function toString() {var str = ''for (var i = 0; i < this.data.length; i++) {str += this.data[i] + '\n'}return str
}function empty() {if (this.data.length === 0) {return true} else {return false}
}// 以下为下篇代码
function count() {return this.data.length
}function Person(name, sex) {this.name = namethis.sex = sex
}function getPerson(boysQueue, girlsQueue) {// 读取包含性别的名字var names = fs.readFileSync('people.txt')// 分行保存var namesArray = names.toString().split('\n')// 取出末尾空格for (var i = 0; i < namesArray.length; i++) {namesArray[i] = namesArray[i].trim()}// 性别与名称分割,并按性别入队for (var i = 0; i < namesArray.length; i++) {var sexAndName = namesArray[i].split(' ')var sex = sexAndName[0]var name = sexAndName[1]if (sex === 'B') {boysQueue.enQueue(new Person(name, sex))} else {girlsQueue.enQueue(new Person(name ,sex))}}
}function match(boysQueue, girlsQueue) {var currBoy, currGirlwhile (!boysQueue.empty() && !girlsQueue.empty()) {currBoy = boysQueue.deQueue()currGirl = girlsQueue.deQueue()console.log(currBoy.name + '与' + currGirl.name + '配对成功啦!!!')}if (boysQueue.count() > 0) {console.log('有' + boysQueue.count() + '个男士缺少女士配对!!')}if (girlsQueue.count() > 0) {console.log('有' + girlsQueue.count() + '个女士缺少男士配对!!')}if ((girlsQueue.count() === 0) && (boysQueue.count() === 0)) {console.log('恭喜!!刚好全部配对完毕,不存在有人单身啦!!!')}
}
// testvar boysQueue = new Queue()
var girlsQueue = new Queue()
getPerson(boysQueue, girlsQueue)
match(boysQueue, girlsQueue)

运行及结果

在node环境下使用node queue.js,运行结果如下:

结合上篇及本篇,一个JavaScript实现的队列类实现完成,并实现完整一个匹配应用,至此,JavaScript数据结构与算法——队列详解篇完结,一般都是深夜编写,也许会有些错误,欢迎指出,谢谢O(∩_∩)O~~

JavaScript数据结构与算法——队列详解(下)相关推荐

  1. JavaScript数据结构与算法——队列详解(上)

    队列基本知识 队列是一种与列表很像的数据结构,只是队列只能在尾部插入元素,在队首删除元素.队列用于存放按顺序排列的元素,先进先出,就像食堂排队一样,后来的只能排在后面,先来的先拿饭,一种井然有序的感觉 ...

  2. JavaScript数据结构与算法——链表详解(下)

    在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...

  3. JavaScript数据结构与算法——列表详解(下),基于Nodejs实现一个列表应用

    1.上篇回顾: 上篇我们实现了一个列表类,并添加了一些属性,实现了比较多的方法,本文章将与大家一起使用列表实现一个图书借阅查询系统.需要使用JavaScript数据结构与算法--列表详解(上)中写好的 ...

  4. JavaScript数据结构与算法——数组详解(下)

    1.二维与多维数组 JavaScript只支持一维数组,但是通过在数组里保存数组元素的方式,可以轻松创建多维数组. 1.1 创建二维数组 二维数组类似一种由行和列构成的数组表格,在JavaScript ...

  5. JavaScript数据结构与算法——链表详解(上)

    注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...

  6. JavaScript数据结构与算法——列表详解(上)

    列表是一组有序的数据,每个数组中的数据项称为元素.数组相关知识不够了解的伙伴可以阅读本人上篇博客在JavaScript中,列表的元素可以是任意数据类型.列表中可以保存不定数量的元素,实际使用时元素的数 ...

  7. c++数据结构中 顺序队列的队首队尾_数据结构与算法—队列详解

    前言 栈和队列是一对好兄弟,前面我们介绍过数据结构与算法-栈详解,那么栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出口,只能后进先出(在外面的先出去).而队列就好比是一个隧道,后面 ...

  8. JavaScript数据结构与算法——栈详解

    1.栈基本知识 栈是一种特殊的列表,栈的元素只能通过列表的一端访问,这一端成为栈顶,栈具有先进后出的特点,要想访问栈底的元素,就必须将上边的元素先拿出来.对栈的操作主要是入栈和出栈,通过push()和 ...

  9. JavaScript数据结构与算法——数组详解(上)

    1.JS中的数组 JS中的数组是一个特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数,但是这些数字索引会在内部转换成字符串类型(因为JS对象中的属性名必须是字符串).数组在JS中只是一种 ...

最新文章

  1. 计算机性能指标ppt,计算机网络分类与主要性能指标.ppt
  2. 关于camera 构架设计的一点看法
  3. pdf python 位置_如何使用PDFMiner获取PDF中文本的位置?
  4. 牛客题霸 [用两个栈实现队列] C++题解/答案
  5. 王成录华为鸿蒙系统,华为手机销量仍在增长!华为王成录:手机会是鸿蒙OS系统的中心...
  6. 经常需要在开发中使用Excel COM,为简化使用写了这个类,感觉还是不太方便
  7. 扩展二叉树(信息学奥赛一本通-T1340)
  8. “Table .__efmigrationshistory doesn’t exist”的解决方案
  9. 0bug到底碰痛了谁的神经?
  10. 我觉得很有必要好好看看JavaScript
  11. java能开发winform程序吗_Java进击C#——应用开发之WinForm环境
  12. g ++在linux下编译rapidxml 使用与过程中出现的问题解决
  13. 360度环绕式全景 微软photosynth震撼体验
  14. Java中对数组降序排列
  15. 网易云音乐的亏损,是社区经济的通病?
  16. 计算机常用单词 pdf,关于计算机的常用词汇.pdf
  17. php图书馆注册模板,php微信公众号开发之校园图书馆
  18. ARM之S5pv210的按键和中断部分
  19. tomcat服务莫名其妙停止
  20. App uni.downloadFile ios问题

热门文章

  1. C 程序的存储空间记录
  2. 《软件架构设计》学习笔记--6--6大步骤2:领域建模
  3. 《Adobe InDesign CS6中文版经典教程》—第2课2.9节应用对象样式
  4. 【iOS开发】跳转到『设置App』的任意条目
  5. [安卓] 7、页面跳转和Intent简单用法
  6. percona-toolkit 之 【pt-table-checksum】、【pt-table-sync】说明
  7. 属性总结(四):linestyle
  8. PHP 入门 - 4.正则表达式
  9. idea 设置加载多个资源文件,显示本地图片
  10. onvirt安装linux系统