JavaScript--队列结构
1.认识队列


2.队列的应用

3.队列类的常见操作

封装一个队列
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 封装队列类
function Queue(){
// 属性
this.items=[]
// 1.将元素加入到队列中
Queue.prototype.enqueue=function(element){
this.items.push(element)
}
// 2.从队列中删除前端元素
Queue.prototype.dequeue=function(){
return this.items.shift()
}
// 3.查看前端的元素
Queue.prototype.front=function(){
return this.items[0]
}
// 4.查看队列是否为空
Queue.prototype.isEmpty=function(){
return this.items==0
}
// 5.查看队列中元素的个数
Queue.prototype.size=function(){
return this.items.length
}
// 6.toString方法
Queue.prototype.toString=function(){
var retultString='';
for(var i=0; i<this.items.length;i++){
retultString+=this.items[i]+' '
}
return retultString
}
}
// 使用队列
var queue=new Queue()
// 将元素加入到队列中
queue.enqueue('abc')
queue.enqueue('cba')
queue.enqueue('nba')
queue.enqueue('mba')
queue.enqueue('abc')
// 从队列中删除元素
queue.dequeue()
alert(queue)
queue.dequeue()
alert(queue)
// front 方法
alert(queue.front())
// 验证其他方法
alert(queue.isEmpty())
alert(queue.size())
</script>
</body>
</html>
4.击鼓传花

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
// 自定义队列
function Queue() {
var items = []
// 队列操作的方法
// enter queue方法
this.enqueue = function (element) {
items.push(element)
}
// delete queue方法
this.dequeue = function () {
return items.shift()
}
// 查看前端的元素
this.front = function () {
return items[0]
}
// 查看队列是否为空
this.isEmpty = function () {
return items.length == 0
}
// 查看队列中元素的个数
this.size = function () {
return items.length
}
}
// 实现击鼓传花的函数
function passGame(nameList, num) {
// 1.创建一个队列, 并且将所有的人放在队列中
// 1.1.创建队列
var queue = new Queue()
// 1.2.通过for循环, 将nameList中的人放在队列中
for (var i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i])
}
// 2.寻找最后剩下的人
while (queue.size() > 1) {
// 将前num-1中的人, 都从队列的前端取出放在队列的后端
for (var i = 0; i < num; i++) {
queue.enqueue(queue.dequeue())
}
// 将第num个人, 从队列中移除
queue.dequeue()
}
// 3.获取剩下的一个人
alert(queue.size())
var endName = queue.dequeue()
alert("最终留下来的人:" + endName)
// 4.获取该人在队列中的位置
return nameList.indexOf(endName)
}
// 验证结果
var names = ['John','Jack','Camila','Ingrid','Carl'];
var index = passGame(names, 7)
alert("最终位置:" + index)
</script>
</body>
</html>
5. 优先级队列


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
// 封装优先级队列
function PriorityQueue() {
var items = []
// 封装一个新的构造函数, 用于保存元素和元素的优先级
function QueueElement(element, priority) {
this.element = element
this.priority = priority
}
// 添加元素的方法
this.enqueue = function (element, priority) {
// 1.根据传入的元素, 创建新的QueueElement
var queueElement = new QueueElement(element, priority)
// 2.获取传入元素应该在正确的位置
if (this.isEmpty()) {
items.push(queueElement)
} else {
var added = false
for (var i = 0; i < items.length; i++) {
// 注意: 我们这里是数字越小, 优先级越高
if (queueElement.priority < items[i].priority) {
items.splice(i, 0, queueElement)
added = true
break
}
}
// 遍历完所有的元素, 优先级都大于新插入的元素时, 就插入到最后
if (!added) {
items.push(queueElement)
}
}
}
// 删除元素的方法
this.dequeue = function () {
return items.shift()
}
// 获取前端的元素
this.front = function () {
return items[0]
}
// 查看元素是否为空
this.isEmpty = function () {
return items.length == 0
}
// 获取元素的个数
this.size = function () {
return items.length
}
}
// 创建优先级队列对象
var pQueue = new PriorityQueue()
// 添加元素
pQueue.enqueue("abc", 10)
pQueue.enqueue("cba", 5)
pQueue.enqueue("nba", 12)
pQueue.enqueue("mba", 3)
// 遍历所有的元素
var size = pQueue.size()
for (var i = 0; i < size; i++) {
var item = pQueue.dequeue()
alert(item.element + "-" + item.priority)
}
</script>
</body>
</html>

浙公网安备 33010602011771号