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

接下来会借助本人另一篇文章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~~

猜你喜欢

转载自blog.csdn.net/fabulous1111/article/details/79860171