welcome to my blog
程序员代码面试指南第二版 3.用递归函数和栈逆序一个栈
题目描述
题目描述
一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,
也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。
输入描述:
输入数据第一行一个整数N为栈中元素的个数。
接下来一行N个整数, 从左到右表示从栈顶依次到栈底的每个元素。
输出描述:
输出一行表示栈中元素逆序后的每个元素
示例1
输入
5
1 2 3 4 5
输出
5 4 3 2 1
第一次做, 最重要的就是两个递归函数的逻辑: 一个是取出栈底元素并返回; 另一个是逆序栈
/*
使用两个递归函数实现
一个递归函数负责取出栈底的元素(取出栈底元素的同时其他元素还在栈中)
另一个递归函数负责将元素压栈
*/
import java.util.Scanner;
import java.util.Stack;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = Integer.valueOf(sc.nextLine());
Stack<Integer> s = new Stack<>();
String[] arr = sc.nextLine().split(" ");
for(int i=arr.length-1; i>=0; i--)
s.push(Integer.valueOf(arr[i]));
Reverse(s);
while(!s.isEmpty()){
System.out.print(s.pop()+" ");
}
}
//将取出的元素入栈: 先取出后入栈
public static void Reverse(Stack<Integer> s){
//base case
if(s.isEmpty())
return;
int curr = stackLastElement(s);
Reverse(s);
s.push(curr);
}
//取出栈s的最后一个元素,其余元素不动
public static int stackLastElement(Stack<Integer> s){
//base case
if(s.size()==1)
return s.pop();
//
int curr = s.pop();
int last = stackLastElement(s);
s.push(curr);
return last;
}
}