栈:一个后进先出的数据结构
栈
JS中没有栈但是可以用Array来实现栈的所有功能
const stack = []
//入栈
stack.push(8)
//出栈(pop移除数组的最后一项并返回它)
const item = stack.pop()
//栈顶
stack[stack.length-1]
栈的应用场景
- 需要后进先出的场景
1、十进制转二进制
2 、判断括号是否有效闭合
3、函数调用堆栈
十进制转二进制
十进制转二进制
后出来的余数排在前面
余数依次入栈再出栈即可实现
有效的括号(是否闭合)
(((())))
{}{}{}{}}
越靠后的左括号对应的右括号越靠前。
从左到右遍历括号,遇到左括号入栈,遇到和栈顶括号匹配的右括号出栈(不匹配直接判断无效),最后栈空了即合法。
[leetcode 20]有效括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
var isValid = function(s) {
if(s.length%2 === 1){return false}
const stack = []
for(let i = 0;i<s.length;i++){
const c = s[i]
if(c==='('||c==='['||c==='{'){
stack.push(c)
}else{
const t = stack[stack.length-1]
if(
(t === '('&&c===')')||
(t === '['&&c===']')||
(t === '{'&&c==='}')
){stack.pop()}else{return false}
}
}
return stack.length === 0
};
函数调用堆栈
最后调用的函数,最先执行完
JS解释器用栈来控制函数的调用顺序
const func1 = ()=>{
func2()
}
const func2 = ()=>{
func3()
}
const func3 = ()=>{
}
func1()
通过VsCode 调试可看调用栈的执行步骤(打断点 F5 调用堆栈)