首页 > 网页制作 >栈实现方向字符串自动对消

栈实现方向字符串自动对消

来源:互联网 2026-06-30 08:27:05

本文详解使用栈结构消除相反方向(如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[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']

注意事项

  • 该算法只处理直接相反的两两方向,不支持 'NORTHEAST' 等斜向组合,也不支持自定义映射。
  • 时间复杂度 O(n),空间复杂度最坏 O(n)——当没有任何抵消时,栈会保留所有输入。
  • 若输入包含非法方向(如 'UP'),会被无条件入栈。生产环境中建议额外添加校验逻辑。
  • stack[stack.length - 1] 是行业通用写法,亦可替换为 stack.at(-1)(ES2022+),语义更清晰但兼容性稍弱。

总结

栈在此算法中扮演“待决方向缓冲区”的角色。stack[stack.length - 1] 的精妙之处在于天然兼容空栈场景,无需额外的 if (stack.length > 0) 判断,正是这种细节设计使函数兼具简洁性与健壮性。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。