【NowCoder】栈-用递归函数和栈逆序一个栈
题目
一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。
输入描述:
输入数据第一行一个整数N为栈中元素的个数。
接下来一行N个整数,表示一个栈依次压入的每个元素。
思路
- 使用两个递归函数
- 一个递归函数用来每次取出栈底元素,另一个栈用来逆序栈
- 每次取出一个栈底元素,然后将其重新压入栈中,达到逆序的目的
代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.Stack;
public class Main {
// 将stack的栈底元素移除并且返回
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 result = getAndRemoveLastElement(stack);// 取出栈底元素
// 递归的作用就是不断向下搜索,然后遇到递归调用出口 之后进行回溯 遇到递归调用出口 结束之后,返回的是递归调用点的下一条语句
reverse(stack);
// 递归调用结束之后 返回递归调用下一条语句 进行回溯
stack.push(result);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] strArr = br.readLine().split(" ");
Stack<Integer> stack = new Stack<>();
for(int i = 0; i < n; i++)
{
stack.push(Integer.parseInt(strArr[i]));
}
reverse(stack);
while(!stack.isEmpty())
{
System.out.print(stack.pop() + " ");
}
}
}