JavaScript算法与数据结构栈之Leetcode20-有效的括号题解
一、栈
1、后进先出
2、 JavaScript用Array实现栈
const stack = [];
stack.push(1);
stack.push(2);
stack.pop();
stack.pop();
二、栈的应用场景
1、十进制转二进制
为毛呢,因为一个十进制熟除以2的余数,最先除出来的余数放在最高位上,随手实现了一个
const translate = (num) => {
let stack = [];
while(num !== 0){
stack.push(num % 2);
console.log(stack);
num = parseInt(num / 2);
}
console.log(stack.join(''));// 101
}
translate(5);
我当然知道JS里面有API可以直接转啦
const translate2 = (num) => {
return parseInt(num).toString(2);
}
console.log(translate2(5));// 101
2、JavaScript中的函数调用堆栈
(1)最后调用的函数,最先执行完
(2)JS解释器使用栈来控制函数的调用顺序
const func1 = () => {
func2();
}
const func2 = () => {
func3();
}
const func3 = () => {}
func1();
这段debug看一下,就知道啦,func3是最先执行完的,再是func2最先执行完,再是func1执行完噻~
三、Leetcode20-有效的括号
1、题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
2、分析一下
灵魂画手来也~
3、解题思路
看上面的手绘图,就是栈来实现的呀
(1)建一个栈
(2)给输入的字符串来个for循环
(3)遇到左边的( [ { 就push到栈里
(4)遇到右边的) ] }就跟栈的最顶端去比,配对成功就消掉,pop出来
(5)如果最后是个空栈就对了
如果输入的字符串长度是奇数就无脑返回false.
4、代码实现
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
if(s.length % 2 === 1) return false;
let stack = [];
for(let i = 0; i < s.length; i++) {
const str = s[i];
if(str === '(' || str === '{' || str === '[') {
stack.push(str);
} else {
const top = stack[stack.length - 1];
if((top === '(' && str === ')')
|| (top === '{' && str === '}')
|| (top === '[' && str === ']')){
stack.pop();
} else {
return false;
}
}
}
return stack.length === 0;
};
点赞支持一下我叭~这样我会更有动力写下去~
===========我来更新啦~=============
四、解法二:Map实现上一题
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
if(s % 2 === 1) return false;
const stack = [];
const map = new Map();
map.set('(', ')');
map.set('{', '}');
map.set('[', ']');
for(let i = 0; i < s.length; i++) {
const top = stack[stack.length - 1];
if(map.has(s[i])) {
stack.push(s[i]);
} else if (s[i] === map.get(top)) {
stack.pop();
} else {
return false;
}
}
return stack.length === 0;
};
这个就是不用写那么多if了,也稍微快些
五、解法三:
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
if(s % 2 === 1) return false;
const length = s.length / 2;
for(let i = 0; i < length; i++) {
s = s.replace('()', '').replace('{}', '').replace('[]', '');
}
return s.length === 0;
};
这个就是代码简洁些,但是有点慢,也看网速吧