这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
栈和队列
- 基于数组
优先级队列
即由插入元素的优先级来决定它的位置,而不是按照元素进出的顺序排列的。因此元素在插入的时候,还有一个优先级数决定这个元素应该被插到哪里。应用:就比如我们生活中有时候会说女士优先、男士优先等,这些都是优先级的体现。
插入元素步骤:
-
封装元素和优先级放在一起(封装一个新的构造函数)
function QueueElement(element, priority) { this.element = element; this.priority = priority; }s -
添加元素的时候,将新插入元素的优先级和队列中已经存在的元素优先级进行比较,获取这个元素的位置。
当这个队列中没有元素,或者插入的元素的优先级都比队列中的元素靠后的,直接push到队列中即可。
splice是一种数组方法。splice(t,v,s)的t: 被删除元素的起始位置;v: 被删除元素个数;s: 被插入的新元素splice(i, 0, queueElement)表示把queueElement插入到第i个元素后一位。0表示被删除元素个数为0.
PriorityQueue.prototype.enqueue = function (element, priority) {
var queueElement = new QueueElement(element, priority);
if (this.items.length == 0) {
this.items.push(queueElement);
} else {
var added = false;
for (let i = 0; i < this.items.length; i++) {
if (queueElement.priority < this.items[i].priority) {
this.items.splice(i, 0, queueElement);
added = true;
}
}
if (!added) {
this.items.push(queueElement);
}
}
}
算法题
-
击鼓传花
题目:n个人,从第一个人开始,数到m时这个人就被淘汰,接着下一个人从1开始数起。直到最后剩的那一个人获胜。
这个题目用队列的方式可以很容易的做出来。之前在洛谷刷到过这道题,那时候还没学到数据结构,现在看倒是容易许多。首先把n个人放到一个队列中,当还没有数到m时,队头元素变成队尾元素,当数到m时,队头元素被淘汰(删除),这样子循环下去,最后得到的结果就是那个获胜的元素。
function Queue() { this.items = []; // 将元素加入到队列中 Queue.prototype.enqueue = function (e) { this.items.push(e); } // 删除第一个元素 Queue.prototype.dequeue = function () { return this.items.shift(); } } function passGame(name, num) { let queue = new Queue(); for (let i = 0; i < name.length; i++) { queue.enqueue(name[i]); } while (queue.items.length > 1) { for (let i = 0; i < num - 1; i++) { queue.enqueue(queue.dequeue(name[i])); } queue.dequeue(name[0]); } let endName = queue.items[0]; console.log(endName); } let nameList = ['Lily', 'Mannqo', 'Ytao', 'mama'] passGame(nameList, 6); -
整数反转
这道题我是用了数组的方式(栈的思想),因为栈的元素是先进后出的,我这里把所给的数字转换为字符串之后一个一个压入栈中,然后再把它一个一个取出来,再转换为数字。比如把
1,2,3分别压入栈中,此时的栈顶就是3,顺序出栈的结果就是3,2,1;最后再根据题目要求返回对应值。var reverse = function (x) { let arr = []; let str = x + ''; let str2 = ''; for (let i = 0; i < str.length; i++) { arr.push(str[i]); } for (let i = 0; i < str.length; i++) { str2 += arr.pop(); } let num = parseInt(str2); if (num < -Math.pow(2, 31) || num > Math.pow(2, 31) - 1) { return 0 } else if (str[0] == '-') { return -num; } else { return num; } };
望大佬们多多指教orz,孩子会好好学的好好学的...