1.有效的括号 leetcode20
首先分析所有的不符合情况,这道题有可能就会遗漏场景
1.已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
2.遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
3.遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
只有字符串遍历完之后,栈是空的,就说明全都匹配了。
var isValid = function (s) {
// 如果不是成对出现的,直接就不符合
if (s.length % 2 !== 0) {
return false
}
// 设置一个map集合
let map = new Map([
['(', ')'],
['{', '}'],
['[', ']']
]);
let stack = [];
for (let item of s) {
if (map.get(item)) {
// 将左括号push进栈中
stack.push(item);
// 下面不在处理左括号
continue;
}
// 找右括号跟现在的遍历的元素是否匹配
if (map.get(stack.pop()) !== item) {
return false
}
}
// 遍历完整个栈中是否还有元素,如果有,说明括号没被完全匹配
return stack.length ? false : true
}
var isValid = function (s) {
for (let item of s) {
let stack = [];
if (item === '(') {
stack.push(')')
} else if (item === '{') {
stack.push('}')
} else if (item === '[') {
stack.push(']')
} else {
// 如果是右括号,但是不等于当前遍历的元素,不符合,或者当栈已经为空了,
// 没有匹配的字符了,说明右括号没有找到对应的左括号时,也不符合
if (stack.pop() !== item) {
return false;
}
}
}
return stack.length === 0;
}
2.删除字符串中的所有相邻重复项 leetcode1047
定义一个栈,如果栈中没有元素或者当前元素跟栈顶的元素不相等的时候,把元素放入站里面,相等的时候,把栈顶的元素弹出来,做一个消除的动作。
var removeDuplicates = function (s) {
let stack = [];
for (let item of s) {
// 栈顶元素当前元素不相等
if (stack.length === 0 || stack[stack.length - 1] !== item) {
stack.push(item)
} else {
// 栈顶元素跟当前元素相等,则消除
stack.pop()
}
}
return stack.join('')
};
3.逆波兰表达式求值 LeetCode150
本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么这岂不就是一个相邻字符串消除的过程,和1047.删除字符串中的所有相邻重复项 (opens new window)中的对对碰游戏是不是就非常像了。
如果是数字就入栈,当碰见操作符的时候,将栈顶的两个元素拿出来,用操作符操作后的结果,在放入栈中,直到碰见下一个操作符,在执行改步骤
["4","13","5","/","+"]
栈中先放入4,13,5.遇见操作符,将15和3拿出来,进行除法操作。然后将除后的结果,放入栈中。遇见加号,则将除后的结果和之前的数字,进行相加,最后放入栈中。
var evalRPN = function (tokens) {
let stack = [];
for (let item of tokens) {
let value = Number(item);
if (isNaN(value)) {
let num1 = stack.pop();
let num2 = stack.pop();
//将遇见操作符之后,栈顶的两个元素的结果放入栈中,继续进行计算
if (item === '+') {
stack.push(num2 + num1)
} else if (item === '-') {
stack.push(num2 - num1)
} else if (item === '*') {
stack.push(num2 * num1)
} else {
// 除法记得取整
stack.push(Math.floor(num2 / num1))
}
} else {
stack.push(value)
}
}
// 取栈顶元素
return stack[0]
};