为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第三天 栈

标签:
算法

第一模块:课程介绍

课程名称:JavaScript版数据结构与算法 轻松解决前端算法面试
课程章节:3-1 栈简介
主讲老师:lewis

第二模块:课程内容

知道什么是栈,学会对栈的基本操作。

第三模块:课程收获

1. 栈是什么?

一个后进先出的数据结构

图片描述

因为在js里面没有栈这个东西,但是我们可以用数组来进行表示。

示例代码

const stack = [];
// 入栈
stack.push(1);
stack.push(2);
// 出栈,移除数组的最后一项并返回它
const item1 = stack.pop();
const item2 = stack.pop();

上面的代码就提现了栈的后进先出的特性

2. 什么场景下使用栈

所有需要后进先出的几个问题

十进制转二进制

如果要把十进制的数字转成二进制的话,就需要不停的除以2,得到余数,最后把所有的余数都收集起来,得到二进制的数据

这个余数的排序也是有要求的,后出来的余数要排在前面。

也就是先进后出的特点。

判断字符串的括号是否有效

(((()))) --- valid
()()()  --- valid
((()    --- invalid

看上面的这个问题,可以假设我们有个左括号的栈,每进去一个左括号,就要有一个对应的右括号,这样,我们在数的时候,可以假设把左括号都堆起来,然后呢,当有一个右括号的时候,就删除一个左括号,就完成了判断了

解题步骤

  • 新建一个栈
  • 扫描字符串,遇到左括号入栈,遇到和栈顶括号类型匹配的右括号就出栈,类型不匹配直接判定位不合法
  • 最后栈空了就合法,否则不合法。

示例代码:

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    // 定义下符号
    const fuhao1 = ['(', '[', '{'];
    const fuhao2 = [')', ']', '}'];
    const zhan1 = [];
    if(fuhao2.includes(s[0])){
        return false;
    }
    for (let i = 0; i < s.length; i++) {
        // 遇到左括号,入栈
        if(fuhao1.includes(s[i])){
            zhan1.push(s[i]);
        }else {
            // 遇到右括号,判断右括号是否对应左括号
            if(fuhao1.indexOf(zhan1[zhan1.length - 1]) !== fuhao2.indexOf(s[i])){
                // 两个不一样,就返回false
                return false;
            }else {
                zhan1.pop();
            }
        }
    }
    return zhan1.length === 0;
};

优化方向

  1. 字符串的长度如果是奇数,就肯定是失败的了
if(s % 2 === 1) return false;

总结

新建的变量会增加空间复杂度,也就是说zhan1会使用n个内存地址,也就是o(n)。我们的for循环带来了时间的复杂度o(n)

结果记录:

图片描述

后续可以用到字典来进行优化

第四模块:课程记录

图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消