最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何用栈对方向字符串进行相邻抵消化简
时间:2026-06-28 10:01:52 编辑:袖梨 来源:一聚教程网
本文详解 dirReduc 函数中栈(stack)的工作机制,重点解释 stack[stack.length - 1] 的安全访问逻辑、空栈时的行为表现,以及方向对(如 NORTH/SOUTH)如何被动态识别并移除。
本文详解 `dirreduc` 函数中栈(stack)的工作机制,重点解释 `stack[stack.length - 1]` 的安全访问逻辑、空栈时的行为表现,以及方向对(如 north/south)与 east/west 如何被动态识别并移除。
该函数的核心思想是利用栈的后进先出(LIFO)特性,逐个处理方向字符串,并实时判断当前方向是否能与“栈顶”方向构成相反关系——若能,则弹出栈顶,实现抵消;否则将当前方向入栈。
关键点在于理解 stack[stack.length - 1] 的行为:
- 当 stack 为空时,stack.length 为 0,因此 stack[stack.length - 1] 等价于 stack[-1];
- JavaScript 中,负索引不被原生支持,访问 stack[-1] 会返回 undefined(而非报错);
- 而 undefined === 'NORTH' 等所有比较均为 false,因此条件判断自动失败,流程进入 else 分支,执行 stack.push(direction) —— 这正是空栈时首个方向得以入栈的根本原因。
下面是一个带注释和调试提示的优化版本:
function dirReduc(arr) { const stack = []; for (const direction of arr) { const top = stack[stack.length - 1]; // 安全读取栈顶(可能为 undefined) // 利用逻辑短路 + 明确判空,提升可读性与健壮性 const isOpposite = (direction === 'NORTH' && top === 'SOUTH') || (direction === 'SOUTH' && top === 'NORTH') || (direction === 'EAST' && top === 'WEST') || (direction === 'WEST' && top === 'EAST'); if (isOpposite) { stack.pop(); // 抵消:移除上一个相反方向 } else { stack.push(direction); // 无抵消:保留当前方向 } } return stack;}// 示例调用console.log(dirReduc(['NORTH', 'SOUTH', 'SOUTH', 'EAST', 'WEST', 'NORTH'])); // → ['SOUTH', 'NORTH']
⚠️ 注意事项:
- 不要误以为 stack[stack.length - 1] 在空栈时会抛错——它只是返回 undefined,这是 JavaScript 数组的合法行为;
- 若需更严格的边界控制(如教学场景),可显式检查 stack.length > 0,但本算法中 undefined 的自然“不匹配”恰恰简化了逻辑;
- 该算法仅处理相邻且紧邻的相反方向(即栈顶与当前项),不支持跨项抵消(如 ['NORTH', 'EAST', 'SOUTH'] 中的 NORTH/SOUTH 不会抵消),符合题目设计意图。
总结:栈在此处充当“记忆最近未抵消方向”的暂存区,而 stack[stack.length - 1] 是安全、简洁且符合直觉的栈顶访问方式——它的“空值宽容性”不是缺陷,而是支撑算法正确启动的关键设计。