1.有效的括号
题目描述
解题思路
1.定义一个辅助栈stack来存放字符串,再定义一个以符号最为键、值的对象obj
2.循环遍历字符串,判断栈顶元素对应的key在obj中的值是否等于当前遍历值s[i],如果等于则直接弹栈,不等于则将s[i]值推入栈中。
3.最后判断栈是否为空,为空则是有效的括号,反之则不是。
var isValid = function(s) {
let obj = {
'{':'}',
'[':']',
'(':')'
}
let stack = [];
for(let i =0;i<s.length;i++){
const top = stack[stack.length - 1]
if(obj[top] == s[i]) {
stack.pop()
} else {
stack.push(s[i])
}
}
return stack.length == 0
};
2.删除字符串中的所有相邻重复项
题目描述
解题思路
1.该题思路与有效的括号类似,先定义一个辅助栈stack来存放遍历过的数据
2.当栈顶元素与当前遍历项相等时弹栈,如果不相等则入栈
3.最后将栈元素拼接成字符串即可。
var removeDuplicates = function(s) {
const stack = []
for(let i = 0;i<s.length;i++){
if(stack[stack.length - 1] == s[i]){ // 判断栈顶元素与当前元素
stack.pop()
} else{
stack.push(s[i])
}
}
return stack.join('')
};
3.逆波兰表达式
题目描述
解题思路
1.逆波兰表达式大概可以理解为遇到运算符之后就将前两个数字拿出来计算结果,将结果作为一个数字继续参与下次计算。
2.由于两个数字之间的除法只取整数部分,需要注意的是正数和负数的取整有区别需要注意。
3.同样定义一个辅助栈stack来存放数字。
4.循环遍历tokens,遇到数字就直接入栈,遇到符号则直接连续弹出两个栈,再将计算结果入栈即可。
5.最后栈中剩下的最后一个数字就是计算结果,题不难,写的时候注意细节即可。
var evalRPN = function(tokens) {
const stack = []
for(let i = 0;i<tokens.length;i++) {
if(!isNaN(tokens[i])){
stack.push(tokens[i])
} else {
const num1 = Number(stack.pop()) // 由于是有效表达式 不用判断极端情况
const num2 = Number(stack.pop())
let res;
if(tokens[i] == '+') {
res = num1 + num2;
} else if(tokens[i] == '-') {
res = num2 - num1 // 减法和除法 num2放前面
} else if(tokens[i] == '*'){
res = num2 * num1
} else {
res = num2 / num1
res = res > 0 ? Math.floor(res) : Math.ceil(res) // 正负数取整有区别
}
stack.push(res)
}
}
return stack.pop()
};