20.有效的括号
题目链接:https://leetcode.cn/problems/valid-parentheses/
var isValid = function(s) {
const stack=[]
for(let i=0;i<s.length;i++){
let c=s[i]
switch(c){
case'(':
stack.push(')');
break;
case'{':
stack.push('}')
break;
case'[':
stack.push(']')
break;
//输出默认结果
default:
if(c!==stack.pop()){
return false
}
}
}
return stack.length===0
};
看完视频所学:
1.解决本题的关键是利用栈,遍历所给的字符串s,遍历到哪一个就将所对应的相反的样子放入栈中,匹配时弹出和所遍历的对比即可。和栈口的相比较消除即可。
2.回顾一下switch
1047. 删除字符串中的所有相邻重复项
题目链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/
var removeDuplicates = function(s) {
// 将s变为数组
s=[...s]
let top =-1 //栈顶元素的下标 默认为-1代表空栈
for(let i=0;i<s.length;i++){
if(top===-1||s[top]!==s[i]){
s[++top]=s[i] //入栈操作
}else{
top-- //出栈
}
}
s.length=top+1
return s.join('')
}
看完视频所学:
1.本题的关键也在于将我们遍历过的元素放入栈中,注意的一点是遍历某个元素的时候如果栈口的元素和其相同,那么将其弹出清除即可。
2.一个小知识点:
栈中定义一个top变量用来表示栈顶元素的下标位置,top默认为-1表示的是空栈,若入栈一个元素,则top++,当top+1等于数组的长度时,表示此栈已满。
150. 逆波兰表达式求值
题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/
var evalRPN = function(tokens) {
const stack=[]
for(let i=0;i<tokens.length;i++){
if(isNaN(Number(tokens[i]))){//不是数字
const a2=stack.pop()
const a1=stack.pop()//出栈
switch(tokens[i]){
case '+':
stack.push(a1+a2)
break;
case '-':
stack.push(a1-a2)
break;
case '*':
stack.push(a1*a2)
break;
case '/':
stack.push(a1/a2|0)
break
}
}
else{
// 是数字
stack.push(Number(tokens[i]))
}
}
return stack[0]
};
看完视频所学:
1.本题的关键在于首先要理解题意是什么意思,所给出的字符串数组这种表示方法为二叉树中的后序表示法,而需要转换为我们所熟悉的中序表示法,然后再计算出来结果。
2.依旧是利用栈,然后遇到数字就将其加入栈中,遇见操作符则从栈中去除两位元素做相关计算,再将结果放入栈中即可。