1.修改Queue类,形成一个Deque类。这是一个和队列类似的数组结构,允许从队列两端添加和删除元素,因此也叫双向队列。写一段测试程序测试该类
2.使用前端完成的Deque类来判断一个给定单词是否为回文
3.修改5-5中的优先队列,使得优先级高的额元素优先码也大。写一段程序测试你的改动
4.修改例5-5中的候诊室程序,使得候诊室内的活动可以被控制。写一个类似菜单系统让用户可以进行如下选择:
a.患者进入候诊室
b.患者就诊
c.显示等待就诊患者名单
{
// 用数组实现一个队列
function Queue() {
this.dataStore = []
this.enqueue = enqueue
this.dequeue = dequeue
this.front = front
this.back = back
this.toString = toString
this.empty = empty
this.count = count
}
// 队尾添加一个元素
function enqueue(element) {
this.dataStore.push(element)
}
// 删除队首的元素
function dequeue() {
return this.dataStore.shift()
}
// 读取队首的元素
function front () {
return this.dataStore[0]
}
// 读取队尾的元素
function back() {
return this.dataStore[this.dataStore.length - 1]
}
// 显示队列内的所有元素
function toString() {
var str = ''
for(var i = 0; i < this.dataStore.length; i++) {
str += this.dataStore[i] + '\n'
}
return str
}
// 判断队列是否为空
function empty() {
if (this.dataStore.length == 0) {
return true
} else {
return false
}
}
function count() {
return this.dataStore.length
}
// 测试程序
// var q = new Queue()
// q.enqueue('gao')
// q.enqueue('xiao')
// q.enqueue('hei')
// console.log(q.toString())
// q.dequeue()
// console.log(q.front())
// console.log(q.back())
// 方块舞
function Dancer(name, sex) {
this.name = name
this.sex = sex
}
var names = ['F 高甜甜', 'M 陈宇', 'M 周亚楠', 'M 李冬', 'F 王莎']
function getDancers (names, males, females) {
for(var i = 0; i < names.length; i++) {
names[i] = names[i].trim()
var dancer = names[i].split(' ')
var sex = dancer[0]
var name = dancer[1]
if (sex == 'F') {
females.enqueue(new Dancer(name, sex))
} else {
males.enqueue(new Dancer(name, sex))
}
}
}
function dance(females, males) {
while (!females.empty() && !males.empty()) {
var person = females.dequeue()
console.log('女演员:'+ person.name)
person = males.dequeue()
console.log('男演员:' + person.name)
}
}
// 测试程序
// var maleDancers = new Queue()
// var femaleDancers = new Queue()
// getDancers(names, maleDancers, femaleDancers)
// dance(femaleDancers, maleDancers)
// if(!femaleDancers.empty()) {
// console.log('剩下女演员:' + femaleDancers.front().name)
// } else {
// console.log('没有女演员了')
// }
// if(!maleDancers.empty()) {
// console.log('剩下男演员:' + maleDancers.front().name)
// } else {
// console.log('没有男演员了')
// }
// if(femaleDancers.count() > 0) {
// console.log('女演员等候:'+femaleDancers.count())
// }
// if(maleDancers.count() > 0) {
// console.log('男演员等候:'+femaleDancers.count())
// }
// 使用队列对数据进行排序
/**
*
* @param {*} nums 需要排序的数据
* @param {*} queues 空队列数组
* @param {*} n 多少个数据 10个这里其实都可以在这一个方法里处理 根据数据来确定n的大小,以及根据数据的length实例化length个队列
* @param {*} digit 表示个位或者十位上的值
*/
function distribute(nums, queues, n, digit) {
for(var i = 0; i < n; i++) {
if(digit == 1) {
queues[nums[i]%10].enqueue(nums[i]) // 余数是个位
} else {
queues[Math.floor(nums[i] / 10)].enqueue(nums[i]) // 商是十位
}
}
}
function collect(queues, nums) {
var i = 0;
for(var j = 0; j < 10; ++j) {
while (!queues[j].empty()) {
nums[i++] = queues[j].dequeue()
}
}
console.log(nums)
}
function disArray(arr) { // 展示需要排序的数据
for(var i = 0; i < arr.length; ++i) {
// console.log(arr[i] + '')
}
}
// 主程序
var queues = []
for(var i = 0; i < 10; ++i) { // 创建队列 有几个数据就创建几个队列 这里有10个数据就创建10个队列
queues[i] = new Queue()
}
var nums = []
for(var i = 0; i < 10; i++) { // 创建10个0~100以内的数据,存放在nums数组里
nums[i] = Math.floor(Math.random()*100)
}
// 测试程序
// disArray(nums)
// distribute(nums, queues, 10, 1)
// collect(queues, nums)
// distribute(nums, queues, 10, 10)
// collect(queues, nums)
/**
* 优先队列
* 从优先队列中删除元素时,需要考虑优先权的限制 医院急诊科的候诊室
*/
function Patient(name, code) { // 存储队列元素的对象
this.name = name
this.code = code
}
// 寻找优先级最高的元素 优先码低的优先级越高
function dequeue() {
if(this.dataStore.length == 0) return
var codeIndex = this.dataStore[0].code
var index = 0;
for(var i = 0; i < this.dataStore.length; ++i) {
if (this.dataStore[i].code < codeIndex) {
index = i;
return this.dataStore.splice(index, 1)
}
}
return this.dataStore.splice(index, 1)
}
// 展示Patient对象 重新改写toString方法
function toString() {
var retStr = ''
for(var i = 0; i < this.dataStore.length; ++i) {
retStr += this.dataStore[i].name + ' code:' + this.dataStore[i].code + '\n'
}
return retStr
}
var p = new Patient('xiaohei', 4)
var ed = new Queue()
ed.enqueue(p)
console.log(p.name + ' 进入候诊名单')
p = new Patient('heihei', 5)
ed.enqueue(p)
console.log(p.name + ' 进入候诊名单')
p = new Patient('chouchou', 4)
ed.enqueue(p)
console.log(p.name + ' 进入候诊名单')
p = new Patient('tiantian', 1)
ed.enqueue(p)
console.log(p.name + ' 进入候诊名单')
p = new Patient('gaojianhei', 6)
ed.enqueue(p)
console.log(p.name + ' 进入候诊名单')
console.log('等待就诊名单:' + '\n' + ed.toString())
let jiuzhenPatient = ed.dequeue()
console.log('-------')
console.log(jiuzhenPatient[0]['name'] + ' 正在就诊')
console.log('等待就诊名单:' + '\n' + ed.toString())
jiuzhenPatient = ed.dequeue()
console.log('-------')
console.log(jiuzhenPatient[0]['name'] + ' 正在就诊')
console.log('等待就诊名单:' + '\n' + ed.toString())
jiuzhenPatient = ed.dequeue()
console.log('-------')
console.log(jiuzhenPatient[0]['name'] + ' 正在就诊')
console.log('等待就诊名单:' + '\n' + ed.toString())
jiuzhenPatient = ed.dequeue()
console.log('-------')
console.log(jiuzhenPatient[0]['name'] + ' 正在就诊')
console.log('等待就诊名单:' + '\n' + ed.toString())
// var seen = ed.dequeue()
// console.log(seen.name)
// 1.修改Queue类,形成一个Deque类。这是一个和队列类似的数组结构,允许从队列两端添加和删除元素,因此也叫双向队列。写一段测试程序测试该类
// 用数组实现一个队列
/**
* 只需要添加四个方法 在队列两端添加和删除元素
*/
function Deque() {
this.dataStore = []
this.enFrontQueue = enFrontQueue
this.deFrontQueue = deFrontQueue
this.enBackQueue = enBackQueue
this.deBackQueue = deBackQueue
this.front = front
this.back = back
this.toString = toString
this.empty = empty
this.count = count
}
// 双向队列头部添加元素
function enFrontQueue(element) {
this.dataStore.splice(0,0,element)
}
// 头部删除元素
function deFrontQueue() {
return this.dataStore.splice(0,1)
}
// 尾部添加元素
function enBackQueue(element) {
this.dataStore.push(element)
}
// 尾部删除元素
function deBackQueue(element) {
return this.dataStore.pop()
}
// 测试用例
var q = new Deque()
// 头部插入元素
q.enFrontQueue('gao')
// 头部插入元素
q.enFrontQueue('xiao')
// 尾部插入元素
q.enBackQueue('hei')
// console.log(q.dataStore) // ["xiao", "gao", "hei"]
// 头部删除元素
q.deFrontQueue()
// console.log(q.dataStore) // ["gao", "hei"]
// 尾部删除元素
q.deBackQueue()
// console.log(q.dataStore) // ["gao"]
// 2.使用前端完成的Deque类来判断一个给定单词是否为回文
function isHuiwen(str) {
if (str.length == 0) return
var newQ = new Deque()
for(var i = 0; i < str.length; ++i ) {
newQ.enBackQueue(str[i])
}
function toHuiwen() {
if (newQ.count() == 1) {
console.log('is')
return true
}
while (newQ.count() > 1) {
if (newQ.deFrontQueue() == newQ.deBackQueue()) {
toHuiwen()
} else {
console.log('not')
return false
}
}
}
toHuiwen()
}
// 测试用例
// isHuiwen('exexe')
// 3.修改5-5中的优先队列,使得优先级高的额元素优先码也大。写一段程序测试你的改动
// 重写 dequeue()方法
// 寻找优先级最高的元素 号码越高的优先级越高
// function dequeue() {
// if (this.dataStore.length == 0) return
// var codeIndex = this.dataStore[0].code
// var index = 0;
// for (var i = 0; i < this.dataStore.length; ++i) {
// console.log(codeIndex)
// if (this.dataStore[i].code > codeIndex) {
// index = i;
// return this.dataStore.splice(index, 1)
// }
// }
// return this.dataStore.splice(index, 1)
// }
// 4.修改例5-5中的候诊室程序,使得候诊室内的活动可以被控制。写一个类似菜单系统让用户可以进行如下选择:a.患者进入候诊室 b.患者就诊 c.显示等待就诊患者名单
// 分清时间点很重要 其次 尽量不要在方法中去打印,在调用之后打印
}
网友评论