Java教程

【九月打卡】第三天 栈

本文主要是介绍【九月打卡】第三天 栈,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

第一模块:课程介绍

课程名称: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)

结果记录:

图片描述

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

第四模块:课程记录

图片描述

这篇关于【九月打卡】第三天 栈的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!