概念:
1.一个后进先出的数据结构
2.JavaScript中没有栈,但可以用Array模拟栈
概念代码实现:
const stack = []
//用数组模拟栈
stack.push(1)
//通过push推入一个数,实现入栈
stack.pop()
//通过pop弹出栈顶元素,实现出栈
哪里需要用到栈?
1.所有需要用到后进先出的场景
例:
十进制转二进制:
短除法将所有余数依次入栈,然后将得到的结果从栈顶依次出栈。每次计算余数后将所得余数存到一个栈中,由于栈先进后出的特点,在依次出栈时最先得到的余数被压在栈底,最后才被取到。
括号匹配:
由于括号分为左和右,可以把遍历的左括号入栈,然后遍历所有的右括号,然后与其中的所有左括号相匹配,匹配成功则出栈,最后栈为空时即全部匹配完成,如果最后栈内还有剩余元素,则代表还有括号没有被匹配到。
JS函数运行机制:
JS解释器是通过栈来控制函数调用的顺序,最后调用的函数最先执行完。
leetcode算法题:
20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
- 运用栈来存放数据。
- 每次检测到左括号时将其入栈,扫描到右括号时将其与当前栈顶括号匹配,如果匹配成功则将栈顶元素出栈进行下一轮匹配,如果类型不匹配则直接返回false。
- 所有括号便利完毕后查看栈是否为空栈,空栈则返回true,非空则为false。
代码实现:
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
if(s.length % 2 != 0 ){return false}
const stack = []
for (let i = 0;i< s.length;i++){
let c = s[i]
if(c==='(' || c==='{' || c==='['){
stack.push(c)
}else{
const top = stack[stack.length-1]
if (
(top==='{' && c ==='}')||
(top==='(' && c ===')')||
(top==='[' && c ===']')
){
stack.pop()
}else{
return false
}
}
}
return stack.length === 0
};
总结:
栈常用操作:
push(arg)
//入栈
pop()
//出栈
stack[stack.length-1]
//栈顶元素