栈结构和队列结构
一、栈结构
特点:后进先出、只能在一端操作、包括进栈和出栈、递归算法中的递归会出现栈溢出的情况
应用:十进制转换成二进制
涉及其他知识点:在js里面写的数字浏览器默认是处理成十进制数字;如果是0x开头则处理成16进制;如果是0开头的则处理成8进制。
十进制转化为二进制:示例
浏览器验证结果:利用toString()
实现十进制格式的整数转化为二进制:
class Stack {
// => this.container=[];
container = [];
// 进栈
enter(item) {
this.container.push(item);
}
// 出栈
leave() {
return this.container.pop();
}
// 长度
size() {
return this.container.length;
}
// 内容
value() {
return this.container.slice(0);
}
}
// 把十进制格式的“整数”转换为二进制格式的字符串
Number.prototype.decimal2binary = function decimal2binary() {
// this->new Number(28) decimal->28
let decimal = +this;
if (/\./.test(decimal)) {
// 包含小数
throw new RangeError('处理的数字必须是整数');
}
// 整数
let sk = new Stack;
if (decimal === 0) return '0';
while (decimal > 0) {
sk.enter(decimal % 2);
decimal = Math.floor(decimal / 2);
}
return sk.value().reverse().join('');
};
验证一个数是不是整数
使用正则:
/\./.test(Number) //true则是小数 false则是整数
验证结果:let num = 28 num.toString(2) /num.decimal2binary()
二、队列结构
特点:先进先出
应用:允许在前端删除,后端插入
特殊:优先级队列
自己写一个队列的结构:
/* 队列结构:先进先出、后进后出「从一端进,但是需要从另外一端出」 => EventLoop 涉及优先级队列 */
class Queue {
container = [];
// 从顶端进入队列
enter(item) {
this.container.unshift(item);
}
// 从底端出队列
leave() {
return this.container.pop();
}
// 长度
size() {
return this.container.length;
}
// 内容
value() {
return this.container.slice(0);
}
}
// 击鼓传花
// + n参与的人数 >=1
// + m被淘汰的数字
const game = function game(n, m) {
// 让参与的人依次进入队列
let qe = new Queue;
for (let i = 1; i <= n; i++) {
qe.enter(i);
}
// 只要队列中还存在两个及两个以上的人,则重复这个逻辑
while (qe.size() > 1) {
for (let i = 1; i < m; i++) {
// 前m-1个人,出队列后立即进入队列
qe.enter(qe.leave());
}
// 数到m的人直接出队列被淘汰了
qe.leave();
}
return qe.value()[0];
};
console.log(game(8, 5));