算法基础-栈及其使用场景
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
中打好断点标记,然后按f5
(mac
电脑是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