javascript
JavaScript数据结构与算法——队列详解(下)
接下來會(huì)借助本人另一篇文章JavaScript數(shù)據(jù)結(jié)構(gòu)與算法——隊(duì)列詳解(上)中實(shí)現(xiàn)的隊(duì)列類及其方法實(shí)現(xiàn)一個(gè)應(yīng)用。
配對問題
需求分析:在一個(gè)文件中保存著一份男女混合的數(shù)據(jù),名稱前以B開頭表示男士,以G開頭表示女士,將文件中的男女讀出來,分別放進(jìn)一個(gè)隊(duì)列,兩兩配對(比如排成兩隊(duì),相對的匹配男女朋友),直至有一方人數(shù)為0,若剛好雙雙配對成功,則顯示“全部配對完成”,若有人沒配對成功,則顯示沒配對成功的人的性別及其名稱。
文件準(zhǔn)備
準(zhǔn)備一份包含男女的文件,本人準(zhǔn)備的是people.txt,內(nèi)容格式如下:
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 }讀取文件,分配入隊(duì)
讀取文件我們可以借助nodejs的文件系統(tǒng)fs讀取文件,然后使用字符串、數(shù)組之間的轉(zhuǎn)換函數(shù)實(shí)現(xiàn)人名的分割,隨后按男女保存到各自的隊(duì)列中。
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()}// 性別與名稱分割,并按性別入隊(duì)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))}} }實(shí)現(xiàn)配對方法
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() + '個(gè)男士缺少女士配對!!')}if (girlsQueue.count() > 0) {console.log('有' + girlsQueue.count() + '個(gè)女士缺少男士配對!!')}if ((girlsQueue.count() === 0) && (boysQueue.count() === 0)) {console.log('恭喜!!剛好全部配對完畢,不存在有人單身啦!!!')} }這個(gè)比較簡單,就不注釋了,有疑問的話研究一下代碼就能理解。
測試用例
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 = [] // 存放數(shù)據(jù)this.enQueue = enQueue // 入隊(duì)操作this.deQueue = deQueue // 出隊(duì)操作this.first = first // 訪問第一個(gè)元素this.last = last // 訪問最后一個(gè)元素this.toString = toString // 顯示隊(duì)列中的數(shù)據(jù)this.empty = empty // 清空隊(duì)列數(shù)據(jù)this.count = count // 顯示隊(duì)列當(dāng)前元素?cái)?shù)量 }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()}// 性別與名稱分割,并按性別入隊(duì)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() + '個(gè)男士缺少女士配對!!')}if (girlsQueue.count() > 0) {console.log('有' + girlsQueue.count() + '個(gè)女士缺少男士配對!!')}if ((girlsQueue.count() === 0) && (boysQueue.count() === 0)) {console.log('恭喜!!剛好全部配對完畢,不存在有人單身啦!!!')} } // testvar boysQueue = new Queue() var girlsQueue = new Queue() getPerson(boysQueue, girlsQueue) match(boysQueue, girlsQueue)運(yùn)行及結(jié)果
在node環(huán)境下使用node queue.js,運(yùn)行結(jié)果如下:
結(jié)合上篇及本篇,一個(gè)JavaScript實(shí)現(xiàn)的隊(duì)列類實(shí)現(xiàn)完成,并實(shí)現(xiàn)完整一個(gè)匹配應(yīng)用,至此,JavaScript數(shù)據(jù)結(jié)構(gòu)與算法——隊(duì)列詳解篇完結(jié),一般都是深夜編寫,也許會(huì)有些錯(cuò)誤,歡迎指出,謝謝O(∩_∩)O~~
總結(jié)
以上是生活随笔為你收集整理的JavaScript数据结构与算法——队列详解(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你想关掉路由器吗-如何关路由器
- 下一篇: JavaScript数据结构与算法——链