问题
只用递归实现一个栈的翻转,假设栈存储的内容是整数类型。
问题来自面试,主要是考量思想。
分析
分析:递归本身是调用系统栈,我们以1->2->3->4->5
这个序列为例子,实现翻转需要两个过程:
- 弹出当前栈底元素,保存下来,并保持其他元素的位置不动。此时栈的大小是在不断变小的;
- 不断取出栈底元素直到栈空,此时我们取出的顺序是:
1,2,3,4,5
。我们只需要再递归地把它们压入栈就实现了栈的翻转。
Code
// 弹出栈底元素,并保持其他元素位置不动
public int getLastElements(Stack<Integer> stack) {
int num = stack.pop();
if (stack.isEmpty()) return num;
// 如果不是栈底,就递归,并在递归返回时把弹出的值压回去
int res = getLastElements(stack);
stack.push(num);
return res;
}
public void reverse(Stack<Integer> stack) {
if (stack.isEmpty()) return;
// 获取了当前位置的栈的栈底元素,这个元素被保存在i变量中,被压入了JVM的系统栈中
int i = getLastElements(stack);
// 此时又发生了递归,注意这里我们并没有把栈底元素压入栈,相当于把原栈的栈底元素弹出,而其他位置不变。此时不断递归,当只剩一个元素,且被弹出后栈为空,则递归开始返回
reverse(stack);
// 由之前的描述我们可以知道,最后一次递归的i是原栈的栈顶元素5,此时栈为空,压入栈即为栈底,递归不断返回则最后的序列为5->4->3->2->1.
stack.push(i);
}