仅用递归函数和栈操作来逆序一个栈

250 阅读1分钟

要求

一个栈依次压入1,2,3,4,5,将其reverse操作,栈内变成5,4,3,2,1,不借助其他数据结构。

解法

依次取得栈底元素,然后依次入栈。
每次取完栈底元素,要保证其余元素的顺序不变。

第一个递归函数

取得栈底元素并移除,执行过程如下图:

虚线框为递归调用中栈和变量的变化情况,最右侧箭头为递归返回后的执行情况。

实现代码

//返回栈底元素并移除
  public static Integer getAndRemoveLastElement(Stack<Integer> stack) {
    Integer result = stack.pop();
    if (stack.isEmpty()) {
      return result;
    }
    Integer last = getAndRemoveLastElement(stack);
    stack.push(result);
    return last;
  }

第二个递归函数

依次取栈中底部的元素,然后逐一push

public static void reverse(Stack<Integer> stack) {
    if (stack.isEmpty()) {
      return;
    }
    Integer last = getAndRemoveLastElement(stack);
    reverse(stack);
    stack.push(last);
  }