思路
使用递归的方法去逆序一个栈,主要分为两步:
- 
使用递归的方法找到栈 栈底 的元素,并返回
 - 
使用递归的方式,将元素进行逆置操作,涉及到逆序:要先递归,再操作
 
1. 递归寻找栈底的元素
- 
递归函数有返回值,因此函数可以逐层返回需要的值
return getAndRemoveLastElem(stack) - 
递归的结束条件: 当栈为空的时候,结束递归,并返回上一个值,此时的处理是:先将值取出,在判断栈的情况
 - 
递归的操作顺序,由于是找 栈底 的元素,因此是递归先序的方式; 递归结束之后,再将原来的元素放回
 
code:
public static <E> E getAndRemoveLastElem(Stack<E> stack){
  // 查找最后一个元素
  E elem = stack.pop();
  // 最后一个,返回结果
  if (stack.empty()) {
    return elem;
  } else {
    // 如果不是最后一个,则继续寻找,并把刚刚取出的元素放回
    E last = getAndRemoveLastElem(stack);
    stack.push(elem);
    return last;
  }
}
2. 递归向栈中加入元素
- 
首先查找元素,找到元素之后再看递归的操作
 - 
递归函数的返回值: 由于只是对栈进行操作,无返回值
 - 
递归函数的结束条件: 这个结束的条件比较难想,由于是向栈中添加元素,栈满了才结束,但是这个不是递归结束的条件;如何确定呢?在栈中添加元素之前,是将栈低的元素取出来,取完了就该向栈中添元素了,此时为栈递归的结束条件
 - 
递归的操作顺序,只有本地的栈空了才能向其中添加元素,所以先递归的查找栈低的元素,之后再向栈中添加元素,形成一个 对称的U型结构
 
code:
    public static <E> void reverseStack(Stack<E> stack) {
        // 递归结束的条件
        if (stack.empty()) {
            return ;
        } else {
            // 先找到最后的元素,递归再去寻找, 最后找不到了, 从最后开始push到stack中
            E last = getAndRemoveLastElem(stack);
            // 倒序插入的时候, 先递归,再操作
            reverseStack(stack);
            stack.push(last);
        }
    }

京公网安备 11010502036488号