JavaScript有效括号代码中map[stack[stack.length-1]]含义及map用法咨询
代码逻辑解答
这是典型的有效括号匹配算法实现,针对你的疑问逐一说明:
1. map[stack[stack.length - 1]]的具体含义
我们从内到外逐层拆解表达式:
stack是存储未匹配左括号的栈结构,stack.length - 1是栈顶元素的索引,因此stack[stack.length - 1]代表当前栈顶存储的左括号(比如(/[/{)- 这里的
map是普通的JavaScript对象,作用是存储「左括号→对应右括号」的映射关系,用栈顶取出的左括号作为key,就能通过map[左括号]拿到该左括号匹配的正确右括号,比如map['(']的返回值就是)
2. 关于对象属性访问的疑问
你印象里的「对象属性访问要加引号」仅针对点访问法(比如map.xxx),这种写法要求属性名是符合标识符规则的静态字符串,不能是特殊字符也不能是变量。
而代码里用的是方括号访问法,方括号内部可以放任意变量/表达式,JS会自动把表达式的运算结果转为字符串作为属性名查找,完全不需要手动加引号,是完全合法的对象属性访问写法。
3. 第9行整体逻辑
整行判断的作用是校验当前遍历到的字符是否和栈顶左括号匹配:
- 先判断
stack.length > 0保证栈非空,避免取栈顶元素时报错 - 再判断当前遍历的字符
s[i]是否等于栈顶左括号对应的右括号 - 如果两个条件都满足,说明这对括号匹配成功,执行
stack.pop()弹出栈顶的左括号;否则就把当前字符压入栈中 - 遍历结束后如果栈长度为0,说明所有括号都成功匹配,返回
true,否则返回false
拓展:Map数据结构的替代用法
如果你想用更规范的键值对映射结构,也可以用ES6新增的Map数据结构实现相同功能,写法如下:
const map = new Map([ ['(', ')'], ['[', ']'], ['{', '}'] ]) // 取值时用map.get(key)即可,比如map.get(stack[stack.length - 1])
内容的提问来源于stack exchange,提问作者Peifeng
相关产品推荐
相关产品推荐

