链接:https://www.nowcoder.com/questionTerminal/ba7d7f5d1edf4d1690d66e12e951f6ea
来源:牛客网
题目:
一个栈依次压入1,2,3,4,5那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现了栈中元素的逆序,请设计一个算法实现逆序栈的操作,但是只能用递归函数来实现,而不能用另外的数据结构。
给定一个栈Stack以及栈的大小top,请返回逆序后的栈。
测试样例:
[1,2,3,4,5],5
返回:[5,4,3,2,1]
思路:
一、
二、
要取得每次的栈底元素,分别为1,2,3,4,5,再压入5,4,3,2,1。如何取得栈底元素?递归pop,直至栈为空,返回递归最深的那个元素,其他的还要再压回去,否则栈就变了。注意栈底元素return之后就不压回去了,这样下次递归的时候才能取得倒数第二位的。
1. 第一个递归函数:取得栈底元素,并移除。
public static int getAndRemoveLastElement(Stack<Integer> stack) {
int result = stack.pop();
if(stack.isEmpty()) {
return result;
}else {
int last = getAndRemoveLastElement(stack); //递归到找到最后一个元素,命名为last
stack.push(result); //其他名称仍叫result,要重新压入栈
return last; //只返回last一个元素
}
}
2. 第二个递归函数,就是题目最终要求的函数,reverse,其中调用上一个函数,获取栈底。
public static void reverse(Stack<Integer> stack) {
if(stack.isEmpty()) {
return;
}
int last = getAndRemoveLastElement(stack); //取得当前栈底元素
reverse(stack); //递归,依次取出所有栈底元素
stack.push(last); //依次压入
}
完整解答:
import java.util.Stack;
/** * 仅用递归函数和栈逆序一个栈:ReverseStack【2】 * * 【一个栈依次压入1、2、3,将栈转置,使栈顶到栈底依次是1、2、3,只能用递归函数,不能借用额外的数据结构包括栈】 * * 算法思想:两个递归函数(getAndRemoveBottom、reverse) * * @Author: zyx * @Date: 2019/4/25 16:24 * @Description: */
public class ReverseStack {
public static int[] reverseStackRecursively(int[] stack, int top) {
// write code here
if (stack == null || stack.length == 0) {
return null;
}
Stack<Integer> s = new Stack<Integer>();
for (int i = 0; i <= top - 1; i++) {
s.push(stack[i]);
}
reverse(s);
for (int i = top - 1; i >= 0; i--) {
stack[i] = s.pop();
}
return stack;
}
/** * 每层递归取出栈底的元素并缓存到变量中,直到栈空; * * 然后逆向将每层变量压入栈,最后实现原栈数据的逆序。 * * @param stack */
public static void reverse(Stack<Integer> stack) {
if (stack.empty()) {
return;
}
int i = getAndRemoveBottom(stack);// 依次返回1、2、3
reverse(stack);
stack.push(i);// 依次压入3、2、1
}
/** * 返回并移除当前栈底元素(栈内元素<栈底>1、2、3<栈顶>变为2、3<栈顶>). */
public static int getAndRemoveBottom(Stack<Integer> stack) {
int result = stack.pop();
if (stack.empty()) {
return result;
} else {
int Bottom = getAndRemoveBottom(stack);
stack.push(result);
return Bottom;// 第一轮时,返回栈底元素1
}
}
public static void main(String[] args){
int a[] = { 1, 2, 3, 4, 5 };
int b[] = new int[a.length];
b = reverseStackRecursively(a, a.length);
for(int i = 0;i < b.length; i++)
{
System.out.print(b[i] + " ");
}
}
}