算法学习(32)- 递归栈逆序

在这里插入图片描述

import java.util.Stack;

/**
 * @version 0.1
 * @since 2021/10/24
 * @author Void Bug
 *
 * 问题描述
 * 一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。
 */
public class Problem_01_ReverseStackUsingRecursive {
    
    
    /**
     * 1.看我们的栈是否为空
     * 2.我们要得到我们栈底的元素,看我们的栈是否为空,如果是的话,重复此操作,并且在系统中我们会记录着我们每次的值
     * 3.当我们的栈发现为空了,我们返回到上一层,把我们的得到的i及最外层元素的值压入到栈中,重复次操作,及反向压入的一个规程
     * 4。得到我们的新的栈
     * @param stack 传入栈
     */
    public static void reverse(Stack<Integer> stack) {
    
    
        if (stack.isEmpty()) {
    
    
            return;
        }
        int i = getAndRemoveLastElement(stack);//栈底的元素
        reverse(stack);//当前我们的栈相对于原来的栈来说栈底的元素没有了,其他元素是不变的,当我我们的栈为空了,我把这个栈返回,及我已经把每一层的栈底部的值已经拿到了,并且栈清空了被我们
        stack.push(i);//到这部时候,栈就已经是一个空栈(最底层),或者是我们压入了原来到这部时候栈底的元素(不是最底层递归层),我们现在把栈中压入我们这层得到的栈底的元素 i,
    }

    /**
     * 去除掉栈底部的元素,其他元素不变
     *
     * 实现原理:
     * 当我们的栈不为空时候,我们不断进行弹出处理,
     * 当我们的栈为空时候,我们返回给上次递归的项目,并且把值弹出
     * 当我们发现我们到达了最外层,我们会发现我们的原来栈底的元素就被移除了,其他元素的值没有变化
     *
     * 实例: stack=[1,2,3,4,5]=运行此代码后=>stack=[5,1,2,3,4]
     *
     * @param stack 传入栈
     * @return 返回占地的元素,其他元素不变
     */
    public static int getAndRemoveLastElement(Stack<Integer> stack) {
    
    
        int result = stack.pop();//我们取出了栈顶的元素
        //看这时候栈是否为空,为空的话,我返回上次调用的方法,并且返回栈顶的元素
        if (stack.isEmpty()) {
    
    
            return result;
        } else {
    
    
            //不是栈顶的话,我继续进行递归
            //当下层给我们返回值的时候,我们把 result 继续压入到栈中,并且我们把上次传递来的值我们压入到我们的栈栈中,并且我们把last 返回回去,到最后我们的 last 就是我们要求的值
            int last = getAndRemoveLastElement(stack);
            stack.push(result);
            return last;//原来栈顶的元素
        }
    }

    /**
     * 主方法
     * @param args 输入的信息
     * 测试方法
     */
    public static void main(String[] args) {
    
    
        Stack<Integer> test = new Stack<Integer>();
        test.push(1);
        test.push(2);
        test.push(3);
        test.push(4);
        test.push(5);
        reverse(test);
        while (!test.isEmpty()) {
    
    
            System.out.println(test.pop());
        }
    }

}

Guess you like

Origin blog.csdn.net/qq_45205390/article/details/120953735