阅读 93

算法基础-栈及其使用场景

1.使用vscode在编辑器中打断点,对jS进行调试

笔者之前只是在chrome中打断点,进行调试,第一次接触这个vscode的调试,决定作为技能包收录下来。

代码结构如下:

3-stack
├─ index.js
└─ test.js

index.js中的代码如下:

//index.js文件 // 使用js数组模拟栈 const stack = []; //入栈操作 stack.push("加油"); stack.push("达摩~!"); //出栈操作 const item1 = stack.pop(); const item2 = stack.pop(); 复制代码

直接使用node运行js文件没办法断点,那么在vscode中如何打断点呢?

  • 现在vscode中打好断点标记,然后按f5mac电脑是fn+5

  • 项目文件夹下回出一个.vscode的文件夹,里面launch.json是在运行文件的时候的配置,修改如下:

    {   // 使用 IntelliSense 了解相关属性。    // 悬停以查看现有属性的描述。   // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387   "version": "0.2.0",   "configurations": [     {       "type": "pwa-node",       "request": "launch",       "name": "Launch Program",       "skipFiles": [         "<node_internals>/**"       ],       "program": "${file}"     }   ] } 复制代码

    • "program": "${file}":我的理解就是当前文件的意思,vscode界面当前界面是哪个js文件。

  • 断点后结果如下:

上图为f5后的结果,然后来详细说下上面的6个按钮:

  • 点击①按钮:后程序将会运行到下一个断点处,如果没有断点,程序将会执行完毕

  • 点击②按钮:程序将会一步一步的运行。

  • 点击③按钮:如果代码中有函数,可以进入到函数中进行调试

  • 点击④按钮:进入③中的函数调试之后,可以使用④跳出

  • 点击⑤按钮:重启整个调试

  • 点击6按钮:停止调试

2.什么场景下用?

  • 需要后进先出的场景:

    • 观察后得知,越靠后的左括号,对应的右括号越靠前。

    • 判断字符串是否正确闭合方法:从左到右遍历一个字符串,遇到左括号就入栈,遇到右括号就出栈,如果最后栈空了,就是合法

    • 后出来的余数反而要排到前面

    • 把余数一次入栈,然后再出栈,就可以实现余数倒序输出。

    • 十进制转二进制:

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

    • 函数调用堆栈,之前写过文章,这里就不做过多介绍。

3.Leetcode:有效的括号:

下面来做一道关于栈的简单的算法题:

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。

  • 左括号必须以正确的顺序闭合。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va…

/**  * @param {string} s  * @return {boolean}  */ var isValid = function(s) {     if (s.length %2 === 1) return false;     var stack = [];     for(let i=0;i<s.length;i++){         const everyS = s[i];         if(everyS==="(" || everyS ==="[" || everyS === "{"){             stack.push(everyS);         }else{             //栈顶元素             const stackTop = stack[stack.length - 1];             if(                 (stackTop === "(" && everyS === ")") ||                  (stackTop === "[" && everyS === "]") ||                  (stackTop === "{" && everyS === "}")             )             {                 stack.pop();             }else{                 return false             }         }     }     return stack.length === 0; }; 复制代码

????分析:

  • 遍历字符串s,遇到左括号就入栈

  • 如果不是左括号,那么就获取stack栈顶元素,让栈顶元素和当前遍历的这个everyS,是不是一对儿("()"、"[]"、"{}")

    • 是一对:stack数组pop出栈

    • 不是一对:返回false


作者:达摩会武术
链接:https://juejin.cn/post/7027778620697346085


文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐