思路
要求用递归实现,所以只能用一个栈,不能再双栈实现逆序了。
回顾下递归函数的三要素,第一要素:明确你这个函数想要干什么;第二要素:寻找递归结束条件;第三要素:找出函数的等价关系式,即不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。对于递归有没有什么好的理解方法?
对于该题,首先可想到通过越来越小的栈来转置(递归函数之一),但是为了实际操作,需要再写一个递归函数,目的是返回并移除栈底元素。
返回并移除栈底元素的函数思想
结束条件:pop之后栈变为空;等价关系式:pop出一个数后,再对现有的栈实施该函数,弹出并删除栈底元素后,再把刚刚pop出的数压回栈里。
import java.util.Stack;
import java.util.Scanner;
public class Main {
//将栈底的元素返回并移除
public static int getAndRemoveLastElement(Stack<Integer> stack) {
int result = stack.pop();
if(stack.isEmpty()) {
return result;
}
else {
int last = getAndRemoveLastElement(stack);
stack.push(result);
return last;
}
}
//逆序一个栈
public static void reverse(Stack<Integer> stack) {
if(stack.isEmpty()) {
return;
}
int i = getAndRemoveLastElement(stack);
reverse(stack);
stack.push(i);
}
public static void main(String[] args) {
Stack<Integer> myStack = new Stack<Integer>();
Scanner sc = new Scanner(System.in);
int counts = sc.nextInt();
for(int i=0; i<counts; i++) {
int t = sc.nextInt();
myStack.push(t);
}
reverse(myStack);
for(int i=0; i<counts; i++) {
System.out.print(myStack.pop());
System.out.print(" ");
}
}
}