1.修改Queue類比原,形成一個(gè)Deque類妥凳。這是一個(gè)和隊(duì)列類似的數(shù)組結(jié)構(gòu),允許從隊(duì)列兩端添加和刪除元素帜慢,因此也叫雙向隊(duì)列。寫一段測試程序測試該類
2.使用前端完成的Deque類來判斷一個(gè)給定單詞是否為回文
3.修改5-5中的優(yōu)先隊(duì)列,使得優(yōu)先級(jí)高的額元素優(yōu)先碼也大花枫。寫一段程序測試你的改動(dòng)
4.修改例5-5中的候診室程序,使得候診室內(nèi)的活動(dòng)可以被控制掏膏。寫一個(gè)類似菜單系統(tǒng)讓用戶可以進(jìn)行如下選擇:
a.患者進(jìn)入候診室
b.患者就診
c.顯示等待就診患者名單
{
// 用數(shù)組實(shí)現(xiàn)一個(gè)隊(duì)列
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
}
// 隊(duì)尾添加一個(gè)元素
function enqueue(element) {
this.dataStore.push(element)
}
// 刪除隊(duì)首的元素
function dequeue() {
return this.dataStore.shift()
}
// 讀取隊(duì)首的元素
function front () {
return this.dataStore[0]
}
// 讀取隊(duì)尾的元素
function back() {
return this.dataStore[this.dataStore.length - 1]
}
// 顯示隊(duì)列內(nèi)的所有元素
function toString() {
var str = ''
for(var i = 0; i < this.dataStore.length; i++) {
str += this.dataStore[i] + '\n'
}
return str
}
// 判斷隊(duì)列是否為空
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())
// }
// 使用隊(duì)列對(duì)數(shù)據(jù)進(jìn)行排序
/**
*
* @param {*} nums 需要排序的數(shù)據(jù)
* @param {*} queues 空隊(duì)列數(shù)組
* @param {*} n 多少個(gè)數(shù)據(jù) 10個(gè)這里其實(shí)都可以在這一個(gè)方法里處理 根據(jù)數(shù)據(jù)來確定n的大小劳翰,以及根據(jù)數(shù)據(jù)的length實(shí)例化length個(gè)隊(duì)列
* @param {*} digit 表示個(gè)位或者十位上的值
*/
function distribute(nums, queues, n, digit) {
for(var i = 0; i < n; i++) {
if(digit == 1) {
queues[nums[i]%10].enqueue(nums[i]) // 余數(shù)是個(gè)位
} 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) { // 展示需要排序的數(shù)據(jù)
for(var i = 0; i < arr.length; ++i) {
// console.log(arr[i] + '')
}
}
// 主程序
var queues = []
for(var i = 0; i < 10; ++i) { // 創(chuàng)建隊(duì)列 有幾個(gè)數(shù)據(jù)就創(chuàng)建幾個(gè)隊(duì)列 這里有10個(gè)數(shù)據(jù)就創(chuàng)建10個(gè)隊(duì)列
queues[i] = new Queue()
}
var nums = []
for(var i = 0; i < 10; i++) { // 創(chuàng)建10個(gè)0~100以內(nèi)的數(shù)據(jù),存放在nums數(shù)組里
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)
/**
* 優(yōu)先隊(duì)列
* 從優(yōu)先隊(duì)列中刪除元素時(shí)馒疹,需要考慮優(yōu)先權(quán)的限制 醫(yī)院急診科的候診室
*/
function Patient(name, code) { // 存儲(chǔ)隊(duì)列元素的對(duì)象
this.name = name
this.code = code
}
// 尋找優(yōu)先級(jí)最高的元素 優(yōu)先碼低的優(yōu)先級(jí)越高
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對(duì)象 重新改寫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 + ' 進(jìn)入候診名單')
p = new Patient('heihei', 5)
ed.enqueue(p)
console.log(p.name + ' 進(jìn)入候診名單')
p = new Patient('chouchou', 4)
ed.enqueue(p)
console.log(p.name + ' 進(jìn)入候診名單')
p = new Patient('tiantian', 1)
ed.enqueue(p)
console.log(p.name + ' 進(jìn)入候診名單')
p = new Patient('gaojianhei', 6)
ed.enqueue(p)
console.log(p.name + ' 進(jìn)入候診名單')
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類佳簸,形成一個(gè)Deque類。這是一個(gè)和隊(duì)列類似的數(shù)組結(jié)構(gòu)颖变,允許從隊(duì)列兩端添加和刪除元素生均,因此也叫雙向隊(duì)列。寫一段測試程序測試該類
// 用數(shù)組實(shí)現(xiàn)一個(gè)隊(duì)列
/**
* 只需要添加四個(gè)方法 在隊(duì)列兩端添加和刪除元素
*/
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
}
// 雙向隊(duì)列頭部添加元素
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類來判斷一個(gè)給定單詞是否為回文
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中的優(yōu)先隊(duì)列腥刹,使得優(yōu)先級(jí)高的額元素優(yōu)先碼也大马胧。寫一段程序測試你的改動(dòng)
// 重寫 dequeue()方法
// 尋找優(yōu)先級(jí)最高的元素 號(hào)碼越高的優(yōu)先級(jí)越高
// 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中的候診室程序,使得候診室內(nèi)的活動(dòng)可以被控制衔峰。寫一個(gè)類似菜單系統(tǒng)讓用戶可以進(jìn)行如下選擇:a.患者進(jìn)入候診室 b.患者就診 c.顯示等待就診患者名單
// 分清時(shí)間點(diǎn)很重要 其次 盡量不要在方法中去打印佩脊,在調(diào)用之后打印
}