队列
1. 定义
2. 队列的顺序存储结构
- 代码实现
// 队列的封装
function Queue() {
// 属性
this.items = []
// 方法
// 1. 加入队列
Queue.prototype.enqueue = function (element) {
this.items.push(element)
}
// 2. 删除队列前端元素
Queue.prototype.dequeue = function () {
// this.items.pop() pop是从尾取元素
return this.items.shift()
}
// 3. 查看队列是否为空
Queue.prototype.isEmpty = function () {
return this.items.length == 0
}
// 4. 查看队列前端元素
Queue.prototype.front = function () {
return this.items[0]
}
// 5. 查看队列中元素的个数
Queue.prototype.size = function () {
return this.items.length
}
// 6. toString方法
Queue.prototype.toString = function () {
var queueString = ''
for (var i = 0;i < this.items.length; i++) {
queueString += this.items[i] + ' '
}
return queueString
}
}
- 测试
// 测试队列
var queue = new Queue()
// 加入元素中
queue.enqueue(12)
queue.enqueue('adf')
queue.enqueue(23)
queue.enqueue(30)
// toString
alert(queue.toString())
// 移除队列第一
queue.dequeue()
alert(queue.toString())
// 获得第一个元素,不做任何操作
alert(queue.front())
alert(queue.toString())
// 判断是否为
alert(queue.isEmpty())
// 获取队列的元素个数
alert(queue.size())
3. 队列的链式存储结构
队列的链式存储结构,就是线性表的单链表,只是它只能尾进头出
4.优先级队列
如何根据插入数据的 优先级以及数据,判断插入的位置
- 优先级队列的生活应用:
- 头等舱和商务舱乘客的优先级高于经济舱
- 老年人、孕妇、小孩登机优先级高于其他乘客
- 操作系统的进程,按照队列优先级进行处理
- 医院病情的处理顺序
- …
-
优先级队列定义
通过一个数组,存放内部类(含优先级、数据)的数据结构
-
代码实现
// 封装优先级队列 priority queue function priorityQueue() { // 在 priorityQueue 中创建一个类,封装内部类,用于存放数据和优先级 function QueueElement(element,priority) { this.element = element this.priority = priority } // 封装属性 this.items = [] // 1. 实现插入方法 priorityQueue.prototype.enqueue = function (element,priority) { // 1.创建 QueueElement 对象 var queueElement = new QueueElement(element,priority) // 2.判断队列是否为空 if (this.items.length == 0) { // 为空,则没有数据,直接 push 进入 this.items.push(queueElement) } else { // 标识是否在中间插入数据,是则置为 true,否则反之 var added = false for (var i = 0; i < this.items.length; i++) { if (queueElement.priority < this.items[i].priority) { this.items.splice(i,0,queueElement) added = true break } } if (!added) { // 如果没有中间插入,则代表在尾插入数据 this.items.push(queueElement) } } } // 2. 删除队列前端元素 priorityQueue.prototype.dequeue = function () { // this.items.pop() pop是从尾取元素 return this.items.shift() } // 3. 查看队列是否为空 priorityQueue.prototype.isEmpty = function () { return this.items.length == 0 } // 4. 查看队列前端元素 priorityQueue.prototype.front = function () { return this.items[0] } // 5. 查看队列中元素的个数 priorityQueue.prototype.size = function () { return this.items.length } // 6. toString方法 priorityQueue.prototype.toString = function () { var queueString = '' for (var i = 0;i < this.items.length; i++) { queueString += this.items[i].element + '_' + this.items[i].priority + ' ' } return queueString } }
// 测试代码 var pQ = new priorityQueue() pQ.enqueue('abc',111) pQ.enqueue('cba',200) pQ.enqueue('nbc',50) pQ.enqueue('LHH',999) pQ.enqueue('TR',99) // 这个说明什么:alert(pQ)、和alert(pQ.toString()) 一个道理 alert("测试: "+pQ.toString()) alert(pQ)
5. 队列的运用
1. 击鼓传花
简单说明:运用队列的特性,将所有元素入队,再根据逢5则出队,最终只剩一个元素
图示:
2. 实现代码
// 面试题:击鼓传花
// nameList 数组,num 待删除的编号
function passGame(nameList,num) {
// 1. 创建一个队列
var queue = new Queue()
// 2. 将所有人依次加入到队列中
for (var i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i])
}
// 3. 开始数数字
while (queue.size() > 1) {
// 不是 num 的时候,重新加入队列的尾
// 是 num 这个数字的时候,将其从队列中删除
// 3.1 num 数字之前的人重新放入队列尾
for (var i = 0; i < num - 1; i++) {
queue.enqueue(queue.dequeue())
}
// 3.2 num 对应这个人,直接从队列中删除掉
queue.dequeue()
}
// 4. 获取剩下的那个人
alert(queue.size())
var endName = queue.front()
alert("最终剩下的人:"+ endName)
// 获取该数组的下标
return nameList.indexOf(endName)
}
// 测试
var nameList = ['宋小宝','宋铁','宋仁宗','送西瓜','送冬瓜','宋明珠']
var num = 5
alert("返回的下标"+this.passGame(nameList,num))