递归 逆序栈(不申请额外空间)

113 阅读1分钟

题目

将一个栈逆序,但是不能申请额外的数据结构(如数组等)

  • 利用递归栈保存信息的特点,递归进数组最后一项然后返回
  • 递归传入的栈,每次递归过程调用上述方法,当栈为空时,将递归栈保存的弹出值添加进栈中,完成逆序
function reverseStack(stack) {
  if (!stack.length) {
    return;
  }
  // 利用递归栈保存每次弹出的值
  let last = getLast(stack);
  reverseStack(stack);
  // 当栈空掉后,往前回溯才会执行push
  stack.push(last);
}

// 获取栈中最后一位,然后还原剩余数组
function getLast(stack) {
  let end = stack.pop();
  if (!stack.length) {
    return end;
  }
  // 获取弹出的最后一位
  let last = getLast(stack);
  // 利用递归栈还原除最后一位数组
  stack.push(end);
  // 返回最后一位
  return last;
}
let stack = [1, 2, 3];
reverseStack(stack);
console.log(stack);