题目一 20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。
思路
使用栈,遇到左括号,进栈,遇到右括号,则判断当前字符是否和栈顶相等,相等则弹出元素,否则直接返回false
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let stack = [];
let len = s.length;
let map = {
')': '(',
']': '[',
'}': '{'
};
for (let i = 0; i < len; i++) {
let char = s[i];
switch (char) {
case '(':
case '[':
case '{':
stack.push(char);
break;
case ')':
case ']':
case '}':
const top = stack.pop();
if (top !== map[char]) {
return false;
}
}
}
return stack.length === 0;
};
题目二 1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
思路
var removeDuplicates = function(s) {
const stack = [];
for (let i = 0; i < s.length; i++) {
const top = stack[stack.length - 1];
const char = s[i];
if (top === char) {
stack.pop();
} else {
stack.push(char)
}
}
return stack.join('')
};
题目三 150. 逆波兰表达式求值
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
- 有效的算符为 '+'、'-'、'*' 和 '/' 。
- 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
- 两个整数之间的除法总是 向零截断 。
- 表达式中不含除零运算。
- 输入是一个根据逆波兰表示法表示的算术表达式。
- 答案及所有中间计算结果可以用 32 位 整数表示。
/**
* @param {string[]} tokens
* @return {number}
*/
var evalRPN = function(tokens) {
const stack = [];
for (let i = 0; i < tokens.length; i++) {
const char = tokens[i];
if (/\d/.test(char)) {
stack.push(char);
} else {
const right = Number(stack.pop());
const left = Number(stack.pop());
let result = 0;
switch (char) {
case '+':
result = left + right
break;
case '-':
result = left - right
break;
case '*':
result = left * right
break;
case '/':
// 这里需要注意,不让它等于0,所以等于0的话要向上取整
result = left / right > 0 ? Math.floor(left / right) : Math.ceil(left / right)
break;
default:
break;
}
stack.push(result);
}
}
return stack[0];
};