题目要求:不要使用任何其他的辅助数据结构反转一个栈
直接上代码吧,有详细注释和执行过程分析
package dataStructure.recurrence.practice;
import java.util.Stack;
public class ReverseStackUsingRecurrence {
public static void reverse(Stack<Integer> stack) {
//如果栈是空的,直接返回不做任何处理,说明所有的元素已经被弹出了
if(stack.isEmpty()) {
return;
}
//如果不为空,取出栈底元素
int cur = f(stack);
//取出栈底之后的栈继续执行反转
reverse(stack);
//第一次到达这里的时候是栈被弹空的时候
//然后依次是上一次调用他的那个
stack.push(cur);
}
/**
* 黑盒方法,移除并返回stack中的栈底元素
* @param stack
* @return
*/
public static int f(Stack<Integer> stack) {
//如果栈都空了为啥还要调用呢?
if(stack.isEmpty()) {
throw new RuntimeException("stack is empty!!!");
}
//弹出栈顶并保存
int cur = stack.pop();
//返回值
int result;
//如果弹出后栈空了,说明这个元素同时也是栈底
if(stack.isEmpty()) {
return cur;
} else {
//如果没空的话递归调用自身,每次弹出一个,直到空了为止。
result = f(stack);
//空了之后呢把倒数第二个元素放回去然后返回到这里添加倒数第三个元素
//相当于依次取出后再反向放回来(本身取出就是反向的,所以这里跟原来顺序一样,只是移除了最后一个元素)
stack.push(cur);
}
//一级一级返回并继续上一个f的递归调用
return result;
}
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(3);
stack.push(2);
stack.push(1);
reverse(stack);
while(!stack.isEmpty()) {
System.out.println(stack.pop());
}
}
}
看不懂的可以私信我,也欢迎批评指正