栈结构和队列结构

栈结构和队列结构

一、栈结构

特点:后进先出、只能在一端操作、包括进栈和出栈、递归算法中的递归会出现栈溢出的情况
应用:十进制转换成二进制
涉及其他知识点:在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));
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值