20. 有效的括号
思路:遍历s,为左半边的时候入栈,右半边的时候出栈比较是否匹配,不匹配则return false,最后栈为空则return true
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (str) {
if(str.length % 2 === 1) return false
let arr = []
const match = new Map([
[ '(', ')'],
['[',']'],
['{','}']
])
for(let i of str){
if(match.has(i)){
arr.push(i)
}else{
if(i !== match.get(arr.pop())){
return false
}
}
}
return arr.length === 0
}
另外补充: 复习Map 的函数
Map初始化时可以接受数组作为参数,如上代码所示,或者初始化后通过m.set(key, value)
m.has(key)m.get(key)不能像对象一样通过obj[key]的形式获取m.size //属性
1047. 删除字符串中的所有相邻重复项
经典的栈的应用,用数组模拟栈
var removeDuplicates = function(s) {
let stack = []
for (let i of s){
if(i === stack[stack.length -1]){
stack.pop()
}else{
stack.push(i)
}
}
return stack.join('')
};
150. 逆波兰表达式求值
思路: 开始看到很懵,往下看发现提示都把做法写上了,遇到数字则入栈,遇到运算符则取出栈顶两个数字进行计算
/**
* @param {string[]} tokens
* @return {number}
*/
const CALC = {
'+': (a,b)=>a+b,
'-': (a,b)=>a-b,
'*': (a,b)=>a*b,
'/': (a,b)=>a/b|0
}
var evalRPN = function(tokens) {
let stack = []
for(let i of tokens){
if(i === '+' || i === '-' ||i === '*' ||i === '/'){
const n1 = stack.pop()
const n2 = stack.pop()
stack.push(parseInt(CALC[i](n2,n1)))
}else{
// 数字
stack.push(Number(i))
}
}
return stack.pop()
};