本文详解使用栈结构消除相反方向(如NORTH/SOUTH、EAST/WEST)的算法原理,重点解析stack[stack.length - 1]的安全访问逻辑、空栈边界行为,以及为何不会因读取未定义值导致错误。 算法核心思路 该算法利用栈的“后进先出”特性,实时匹配并抵消相邻的相反方向。例如,['N
本文详解使用栈结构消除相反方向(如NORTH/SOUTH、EAST/WEST)的算法原理,重点解析stack[stack.length - 1]的安全访问逻辑、空栈边界行为,以及为何不会因读取未定义值导致错误。
该算法利用栈的“后进先出”特性,实时匹配并抵消相邻的相反方向。例如,['NORTH', 'SOUTH'] 直接对消结果为空数组;而 ['NORTH', 'EAST', 'SOUTH'] 中 NORTH 和 SOUTH 不相邻,栈的动态维护机制可以处理非相邻但可间接抵消的方向,如 ['NORTH', 'SOUTH', 'SOUTH'] 会先抵消前两个,最终剩下 ['SOUTH']。
关键点在于 stack[stack.length - 1] 的行为:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
stack.length 为 0,stack[stack.length - 1] 等价于 stack[-1]。这在 JavaScript 中是合法语法,返回 undefined,而非报错。undefined === 'NORTH' 等比较结果均为 false,因此 if 条件不成立,流程进入 else 分支,将当前方向 push 进栈。stack[stack.length - 1] 既安全又可预测,保证了第一次循环必然执行 push 操作,使栈逐步建立。下方为带调试日志的增强版实现,便于观察每一步的抵消或入栈过程:
function dirReduc(arr) {
const stack = [];
for (let direction of arr) {
const last = stack[stack.length - 1]; // 可能为 undefined(空栈时)
// 只有当栈非空且方向相反时才抵消
const isOpposite =
(direction === 'NORTH' && last === 'SOUTH') ||
(direction === 'SOUTH' && last === 'NORTH') ||
(direction === 'EAST' && last === 'WEST') ||
(direction === 'WEST' && last === 'EAST');
if (isOpposite) {
stack.pop(); // 抵消:移除栈顶
console.log(`抵消: ${last} ←→ ${direction}, 栈变为 [${stack.join(', ')}]`);
} else {
stack.push(direction); // 累积:入栈
console.log(`入栈: ${direction}, 栈变为 [${stack.join(', ')}]`);
}
}
return stack;
}
// 示例调用
console.log(dirReduc(['NORTH', 'SOUTH', 'EAST', 'WEST'])); // → []
console.log(dirReduc(['NORTH', 'SOUTH', 'SOUTH', 'EAST', 'WEST', 'WEST'])); // → ['SOUTH', 'WEST']
stack[stack.length - 1] 是行业通用写法,亦可替换为 stack.at(-1)(ES2022+),语义更清晰但兼容性稍弱。栈在此算法中扮演“待决方向缓冲区”的角色。stack[stack.length - 1] 的精妙之处在于天然兼容空栈场景,无需额外的 if (stack.length > 0) 判断,正是这种细节设计使函数兼具简洁性与健壮性。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述