通俗易懂-数据结构和算法

260 阅读2分钟

前言

大家好,我叫good。想必大家遇到算法或数据结构都是比较抵触的,本篇我将给大家说清楚前端最常用的两种数据结构,以及和大家分享一些算法题。

栈的特点:先进后出

你可以将一个水杯想象成一个栈,往栈里边放东西就相当于往水杯里装水,当你想把水给倒出来的时候你只能从最后装进去的水倒出来,先装进去的水一定是最后才被倒出来的。栈也是如此。
画个图让大家理解更清晰:

image.png

  • 第一个进去的元素,最后一个出来。先进后出

队列

队列的特点:先进先出

有了栈的基础之后,我相信大家理解队列也不是什么难事了。队列恰恰和栈的出去顺序相反。

image.png

  • 第一个进入的元素,第一个出来。先进先出

算法题

  • 使用栈进行进制之间的转换 这里以二进制和十进制为例子:
    十进制整数转二级制的公式是:除二取余
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的人自动淘汰;最后剩下的人会取得胜利,问最后剩下的是原来的哪一位? image.png
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