题一:有效括号
题目链接:有效括号
解题思路: 这题的意思是看给出的这一串括号是否能两两不错位匹配,设计到匹配与位置问题,首先要先想到的应该就是栈,遍历这个字符串,遇到左括号就放相应的右括号,遇到右括号,就看栈顶有没有想等的右括号,如果有,就出栈消掉,跟消消乐一样,如果没有则必不可能闭合。遍历完之后如果这个栈的长度为0,也就是表示都消掉了,则表明是有效括号。
解题代码:
var isValid = function(s) {
if(s.length % 2 !== 0)return false;
let stack = [];
for(let i = 0;i<s.length;i++){
if(s[i] === '('){
stack.push(')');
}else if(s[i] === '{'){
stack.push('}');
}else if(s[i] === '['){
stack.push(']')
}else{
if(s[i] !== stack.pop()){
return false;
}
}
}
return stack.length === 0;
};
题二: 删除字符串中的所有相邻重复项
题目链接: 删除字符串中的所有相邻重复项
解题思路: 这个也跟消消乐一样一样的,遍历这个字符串,然后一个一个元素地放入一个栈,如果碰到栈顶元素与当前元素相同的就抵消掉,最后返回这个栈即可。
解题代码:
var removeDuplicates = function(s) {
let res = [];
for(let i of s){
console.log(i);
if(!res.length || i !== res[res.length-1]){
res.push(i);
}else{
res.pop();
}
}
return res.join('');
};
题三:逆波兰表达式求值
题目链接: 逆波兰表达式求值
解题思路:
其实逆波兰表达式相当于是二叉树中的后序遍历。 大家可以把运算符作为中间节点,按照后序遍历的规则画出一个二叉树。但我们没有必要从二叉树的角度去解决这个问题,只要知道逆波兰表达式是用后续遍历的方式把二叉树序列化了,就可以了。在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么这岂不就是一个相邻字符串消除的过程一样的了。
解题代码:
/**
* @param {string[]} tokens
* @return {number}
*/
var evalRPN = function (tokens) {
let stack = [];
for (let i of tokens) {
let ans = 0;
console.log(stack);
let val1;
let val2;
switch (i) {
case '+':
ans = stack.pop() + stack.pop();
stack.push(ans);
continue;
case '-':
val1 = stack.pop();
val2 = stack.pop();
ans = val2 - val1;
stack.push(ans);
continue;
case '*':
ans = stack.pop() * stack.pop();
stack.push(ans);
console.log('x: ', ans)
continue;
case '/':
val1 = stack.pop();
val2 = stack.pop();
ans = val2 / val1;
stack.push(parseInt(ans));
continue;
default:
stack.push(parseInt(i));
continue;
}
}
return stack[0];
};