接下来会借助本人另一篇文章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 = name
this.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, currGirl
while (!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 = name
this.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, currGirl
while (!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('恭喜!!刚好全部配对完毕,不存在有人单身啦!!!')
}
}
// test
var boysQueue = new Queue()
var girlsQueue = new Queue()
getPerson(boysQueue, girlsQueue)
match(boysQueue, girlsQueue)
运行及结果
在node环境下使用node queue.js
,运行结果如下:
结合上篇及本篇,一个JavaScript实现的队列类实现完成,并实现完整一个匹配应用,至此,JavaScript数据结构与算法——队列详解篇完结,一般都是深夜编写,也许会有些错误,欢迎指出,谢谢O(∩_∩)O~~