如何使用递归函数逆序一个栈

如何使用递归函数逆序一个栈

递归函数1

首先,我们需要设计一个能够将栈中的栈底元素返回并移除的递归函数,使用这个函数我们就可以获取到栈底元素并且其他栈中的顺序不变。代码如下:

	public static int getAndRemoveLastElement(Stack<Integer> stack) {
		int res = stack.pop();   //首先获取此时栈顶元素
		if (stack.isEmpty()) {  //递归结束条件,若栈空,则返回
			return res;
		} else {
			int last = getAndRemoveLastElement(stack);    //继续递归执行
			stack.push(res);  //在last返回之后,res是在last之前弹出的那个值,所以要把这个值压回
			return last;    //将栈底的值层层返回
		}
	}

具体过程如下图:
如何使用递归函数逆序一个栈

递归函数2

第二个递归函数所要完成的就是逆序栈的操作了,具体思路就是使用递归函数1逐层获取栈底的值,然后递归函数返回时将所获取到的值压回。代码如下:

	public static void reverse(Stack<Integer> stack) {
		if (stack.isEmpty()) {
			return;   //递归结束条件
		}
		int i=getAndRemoveLastElement(stack);  //每次获取栈底的值
		reverse(stack);	    //遇到递归结束条件之后,依次将获取到的值压入
		stack.push(i);
	}

具体过程如下图:
如何使用递归函数逆序一个栈

测试函数

	public static void main(String[] args) {
		Stack<Integer> myStack = new Stack<>();
		final int max = 10;
		for (int i = 0; i < max; i++) {
			myStack.push(i);
		}
		reverse(myStack);
		while (!myStack.isEmpty()) {
			System.out.print(myStack.pop() + " ");
		}
	}

这是从左程云左神的书上所学的知识的总结,直接用了左神的图。才疏学浅,若有错误欢迎大家多多提出,定虚心接受。