相关概念
队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素。
队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。
入队操作在队尾插入新元素,出队操作删除队头的元素。
peek()读取队头的元素。
代码
// 队列--先进先出--FIFO
// 常规操作:
// 入队
// 出队
// 返回队头元素 peek()
// length
// clear()
// 底层实现结构--数组
// 数组: push() 末尾添加元素
// 数组: shift() 开头删除元素
// 定义Queue类构造函数
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
}
// enqueue()
function enqueue(element) {
this.dataStore.push(element)
}
// dequeue()
function dequeue() {
return this.dataStore.shift()
}
// 读取队首和队尾元素
// front()
function front() {
return this.dataStore[0]
}
// back()
function back() {
return this.dataStore[this.dataStore.length-1]
}
// toString()显示队列内所有元素
function toString() {
var retStr = ''
for (var i = 0; i< this.dataStore.length; ++i) {
retStr += this.dataStore[i] + '\n'
}
return retStr
}
// empty()
function empty() {
if (this.dataStore.length == 0) {
return true
} else {
return false
}
}
// 测试代码一
var q = new Queue()
q.enqueue('xx1')
q.enqueue('xx2')
q.enqueue('xx3')
console.log('q.toString() ', q.toString())
q.dequeue()
console.log('q.toString() ', q.toString() )
console.log('Front of queue ', q.front())
console.log('Back of queue ', q.back())
// 使用队列解决问题
// **1.方块舞的舞伴分配问题**
var list = [
'F Allison McMillan',
'M Frank Opitz',
'M Mason McMillan',
'M Clayton Ruff',
'F Cheryl Ferenback',
'M Raymond Williams',
'F Jennifer Ingram',
'M Bryan Frazer',
'M David Durr',
'M Danny Martin',
'F Aurora Adney'
]
// 每个舞者的信息都被存储再一个Dancer对象中
function Dancer (name, sex) {
this.name = name
this.sex = sex
}
// 读取舞者信息生成相应队列
function getDancers(males, females) {
var names = list
for (var i = 0; i < names.length; ++i) {
var dancer = names[i].split(' ')
var sex = dancer[0]
var name = dancer[1]
if (sex == 'F') {
femaleDancers.enqueue(new Dancer(name, sex))
} else {
maleDancers.enqueue(new Dancer(name, sex))
}
}
}
// 组成舞伴,宣布配对
function dance(males, females) {
while (!females.empty() && !males.empty()) {
var arr = []
person = females.dequeue()
arr.push(person)
person = males.dequeue()
arr.push(person)
console.log('arr', arr)
}
}
// 测试代码二
var maleDancers = new Queue()
var femaleDancers = new Queue()
getDancers(maleDancers, femaleDancers)
dance(maleDancers, femaleDancers)
if (!femaleDancers.empty()) {
console.log(femaleDancers.front().name + ' is waiting to dance.')
}
if (!maleDancers.empty()) {
console.log(maleDancers.front().name + ' is waiting to dance.')
}
if (!femaleDancers.empty()) {
console.log(femaleDancers.count() + ' is waiting to dance.')
}
if (!maleDancers.empty()) {
console.log(maleDancers.count() + ' is waiting to dance.')
}
// 显示数目
function count() {
return this.dataStore.length
}
if (femaleDancers.count() > 0) {
console.log("There are " + femaleDancers.count() + " female dancers waiting to dance.")
}
if (maleDancers.count() > 0) {
console.log("There are " + maleDancers.count() + " male dancers waiting to dance.")
}
// **2.使用队列对数据进行排序**
// 传入数组,队列,数字个数,个位还是十位排
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 digit = 0; digit < 10; ++digit) {
while (!queues[digit].empty()) {
nums[i++] = queues[digit].dequeue()
}
}
}
// 按顺序输出元素
function dispArray(arr) {
for (var i = 0; i < arr.length; ++i) {
console.log(arr[i] + ' ')
}
}
var queues = []
for (var i = 0; i < 10; ++i) {
queues[i] = new Queue()
}
var nums = []
for (var i = 0; i < 10; ++i) {
nums[i] = Math.floor(Math.floor(Math.random()*101))
}
console.log("Before radix sort: ");
dispArray(nums);
distribute(nums, queues, 10, 1);
collect(queues, nums);
distribute(nums, queues, 10, 10);
collect(queues, nums);
console.log("\n\nAfter radix sort: ");
dispArray(nums);
// **3.优先队列**
// 不懂为什么先删除jane,jane的code为4
// 优先队列不必先进先出
// 重写dequeue()--找出优先码最低的患者
function dequeue() {
var priority = this.dataStore[0].code
for (var i = 1; i < this.dataStore.length; ++i) {
if (this.dataStore[i].code < priority) {
priority = i
}
}
return this.dataStore.splice(priority, 1)
}
// toString()显示Patient对象
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('Smith', 5)
var ed = new Queue()
ed.enqueue(p)
p = new Patient('Jones', 4)
ed.enqueue(p)
p = new Patient("Fehrenbach", 6);
ed.enqueue(p)
p = new Patient("Brown", 1);
ed.enqueue(p)
p = new Patient("Ingram", 1);
ed.enqueue(p)
console.log(ed.toString())
var seen = ed.dequeue()
console.log("Patient being treated: " + seen[0].name)
console.log("Patients waiting to be seen: ")
console.log(ed.toString())
// 下一轮
var seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ")
console.log(ed.toString());
var seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ")
console.log(ed.toString());
function Patient(name, code) {
this.name = name
this.code = code
}
1000



被折叠的 条评论
为什么被折叠?



