问题描述:
现给一个栈,请仅使用递归函数和栈操作逆序该栈,不可使用其他数据结构!
问题分析:
假设现在栈中数据为5-4-3-2-1(栈顶至栈底,下文若无特殊说明,都为栈顶至栈底),我要将这个栈逆序,使其中数据变为1-2-3-4-5;那么首先push进栈的应该为5,其次是4,其次3,其次2,最后是1。
现在知道了目标栈的插入顺序,那么该进行流程的设计,插入的顺序为5,4,3,2,1,有人会说,这还不简单:我连递归函数都不用写,直接将原始栈逐一pop,再push进目标栈不就好了。
如果有这个想法,可能就是没仔细读题了。题中说不可使用其他数据结构,那么就不应该再创建另一个栈,而是在原先的栈上进行操作。
这个插入操作很容易想到是使用递归来完成,那么插入应该在调用递归函数之前还是之后呢?如果在之前,那么第一次递归函数就应该将5插入空栈,问题来了,5可以获得,但是栈怎么变空、变空之后其他的数据该怎么保存呢?
那么现在将插入放在调用递归之后,这个递归函数实际执行的操作顺序应该为1,2,3,4,5。插入5时候必须是空栈,那我们可以这样设计,每次获取并删除底元素,这样不仅能够得到栈内元素,也可以在最后调用的5时变为空栈。
该如何获取栈底元素呢?因为不可以使用其他的数据结构,我们很容易想到用递归的方法来保存数据。现在思路已经明晰,需要两个递归函数,一个用来获取栈底元素,一个用来插入
代码实现:
import java.util.Stack;
public class Reverse_Stack {
//创建一个栈,用该栈进行测试
private static Stack<Integer> stack = new Stack<>();
//该函数用来获取栈底元素同时删除栈底元素
public