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

200 阅读3分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

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