描述
一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。
输入描述:
输入数据第一行一个整数N为栈中元素的个数。
接下来一行N个整数XiX_iXi表示从栈顶依次到栈底的每个元素。
输出描述:
输出一行表示栈中元素逆序后的每个元素
示例1
输入:
5
1 2 3 4 5
输出:
5 4 3 2 1
要求:只允许有一个栈,也就是说只能对一个栈进行操作
解题思路:
先写一个getAndRemoveLastElement递归方法,用来取出栈底元素,并将原本的元素压回去
再写一个reverse递归方法,每次取出一个栈底元素,将最后取出的栈底元素(原始的栈顶元素)放入栈的最底部
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Stack<Integer> myStack=new Stack<Integer>();
Scanner in = new Scanner(System.in);
int N = Integer.valueOf(in.nextLine());
String S=in.nextLine();
String[] ss=S.split(" ");//分割成ss[1,2,3,4,5]
for(int i=ss.length-1;i>=0;i--){//先将5压入
myStack.push(Integer.valueOf(ss[i]));
}
//执行逆序操作
reverse(myStack);
//遍历输出
while(!myStack.isEmpty()){
System.out.print(myStack.pop()+" ");
}
}
//取出栈底元素,返回栈底元素并移除
//递:每次取出栈顶元素,直到取到栈底元素,返回栈底元素 3 2 1
//归:取出栈底元素1后,将原本取出的元素放回栈中2 3
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;
}
}
//递:每次reverse都调用一次getAndRemoveLastElement,每次都取出一个栈底元素并返回,直到栈为空,return
//归:每次回归进行一次stack.push(i);
//最后递的,最先归!!!!最后递的3,第一个归的就是3,压入栈底
//原本的栈:3 2 1 递归后1 2 3
//将取出的元素又重新放入栈,进行逆序操作
public static void reverse(Stack<Integer> stack){
if(stack.isEmpty()){
return;
}
int i = getAndRemoveLastElement(stack);
reverse(stack);
stack.push(i);
}
}