本文详解 dirReduc 函数中栈(stack)的工作机制,重点解释 stack[stack.length - 1] 的安全访问逻辑、空栈时的行为表现,以及方向对(如 NORTH/SOUTH)如何被动态识别并移除。
本文详解 `dirreduc` 函数中栈(stack)的工作机制,重点解释 `stack[stack.length - 1]` 的安全访问逻辑、空栈时的行为表现,以及方向对(如 north/south)与 east/west 如何被动态识别并移除。
该函数的核心思想是利用栈的后进先出(LIFO)特性,逐个处理方向字符串,并实时判断当前方向是否能与“栈顶”方向构成相反关系——若能,则弹出栈顶,实现抵消;否则将当前方向入栈。
关键点在于理解 stack[stack.length - 1] 的行为:
下面是一个带注释和调试提示的优化版本:
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] 是安全、简洁且符合直觉的栈顶访问方式——它的“空值宽容性”不是缺陷,而是支撑算法正确启动的关键设计。