20. 有效的括号
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let map = new Map();
map.set("{","}");
map.set("[","]");
map.set("(",")");
let stack = [];
for (const char of s) {
// i 左括号, 将对应右括号入栈
if (map.has(char)) {
stack.push(map.get(char));
// 右括号,与栈顶不匹配
} else if (char !== stack.pop()) {
return false;
}
}
if (!stack.length) return true;
return false;
};
1047. 删除字符串中的所有相邻重复项
这道题掌握了思路其实比括号匹配还要简单
/**
* @param {string} s
* @return {string}
*/
var removeDuplicates = function(s) {
let stack = [];
for (const char of s) {
// 当前字符 === 栈顶元素
if (stack.length && char === stack[stack.length - 1]) {
stack.pop();
} else {
stack.push(char);
}
}
stack = stack.join("");
return stack;
};
150. 逆波兰表达式求值
/**
* @param {string[]} tokens
* @return {number}
*/
var evalRPN = function(tokens) {
let stack = [];
let operatorMap = new Map([
["+", (a, b) => a + b],
["-", (a, b) => a - b],
["*", (a, b) => a * b],
["/", (a, b) => Math.trunc(a / b)]
]);
for (const char of tokens) {
// 运算符 根据情况进行计算
if (operatorMap.has(char)) {
// 注意顺序
let num2 = stack.pop();
let num1 = stack.pop();
// 非常高妙的处理
let res = operatorMap.get(char)(num1, num2);
stack.push(res);
} else {
// 数字 直接入栈 【注意!!】数据类型
stack.push(Number(char));
}
}
return stack.pop();
};