前言
大家好,我叫good。想必大家遇到算法或数据结构都是比较抵触的,本篇我将给大家说清楚前端最常用的两种数据结构,以及和大家分享一些算法题。
栈
栈的特点:先进后出
你可以将一个水杯想象成一个栈,往栈里边放东西就相当于往水杯里装水,当你想把水给倒出来的时候你只能从最后装进去的水倒出来,先装进去的水一定是最后才被倒出来的。栈也是如此。
画个图让大家理解更清晰:
- 第一个进去的元素,最后一个出来。先进后出
队列
队列的特点:先进先出
有了栈的基础之后,我相信大家理解队列也不是什么难事了。队列恰恰和栈的出去顺序相反。
- 第一个进入的元素,第一个出来。先进先出
算法题
- 使用栈进行进制之间的转换
这里以二进制和十进制为例子:
十进制整数转二级制的公式是:除二取余
let num = 10;
let stack = []; // 创建一个栈
let toBinary = function toBinary(num) {
if (num == 0) return stack.unshift(0);
if (num == 1) return stack.unshift(1);
stack.unshift(num % 2); // 将余数放入栈中
two(Math.floor(num / 2), mode); // 除二后递归下一轮
return stack.join(''); // 返回二进制字符
}
}
console.log(toBinary(num)); // '1010'
// 使用内置API将十进制转换成二进制
console.log((num).toString(2)); // '1010'
- 使用队列
N个人一起玩游戏,从1开始数数,数到M的人自动淘汰;最后剩下的人会取得胜利,问最后剩下的是原来的哪一位?
let queue = []; // 创建队列
let game = function game(n, m) {
// 将每一个人放入队列
for (let i = 1; i <= n; i++) queue.push(i);
// 循环淘汰人
for (let i = 1; count <= m; i++) {
if (queue.length === 1) return queue[0]; // 剩下最后一个人返回
let move = queue.shift();
if (i !== m) {
queue.push(move);
} else {
count = 0;
}
}
}
console.log(game(3, 2)); //=> 3