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());
}
}
}
算法学习(32)- 递归栈逆序
猜你喜欢
转载自blog.csdn.net/qq_45205390/article/details/120953735
今日推荐
周排行