【栈与队列】仅用递归函数算法来操作一个栈,使栈逆序排列。

功能需求

        一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1.如果将这个栈经过系列转置之后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,而不是使用其他数据结构,也不能使用第二个栈。

详细解析

        在之前我们曾经使用过两个栈操作一组数据,经过两次压栈出栈操作,我们可以得到逆序队列。但是题目要求的是主要考察使用递归函数来设计,所以我们需要设计出两组递归函数来模仿这两个栈操作,从而实现逆序栈。

        递归函数一:将栈stack的栈底元素返回并移除。具体实现如下代码中的getAndRemoveLastElement方法。

代码实现1 

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;
	}
}

        我们来画个图来分析一下这个算法的运行流程

        递归函数二:逆序一个栈,那么我们可以使用第二种方法,也就是题目要求的方法,具体的需要的是reserve方法。可以调用上面的getAndRemoveLastElement()方法。

代码实现2 


public static void reverse(Stack<Integer> stack) {
	// 栈数据判空操作
	if (stack.isEmtpy()) {
		return;
	}
	// 调用上面的操作函数来删除栈顶数据得到逆序结果
	int i = getAndRemoveLastElement(stack);
	// 递归调用reverse方法
	reverse();
	// 栈底存入栈数据
}

        让我们也来分析一下这个程序的执行流程

调用递归算法保留弹出数据算法流程图

getAndRemoveLastElement()方法在图中简单表示为get方法,表示移除并返回当前栈元素

总结分析

        当我们碰到使用递归来操作循环的时候,一定要考虑到的两个问题是:第一这个方法执行到什么时候,从程序的开始到再次调用本方法的时候结束。第二就是当调用完成或者不符合条件而跳出递归的时候,调用本方法之后的代码将是如何继续运行的。其实你只需要再进行详细分化一下,不难得出一个规律,递归相当于一个while(true)的死循环,也就是你如何使用break的问题,本身这个问题就是让你熟悉了解递归算法到底是怎样的执行流程,其实不难发现,先弹出,再弹出,弹完了之后再去运行之后的保存,就相当于你走路一样,刚走到终点,不能直接飞回起点吧。ok今天的分享就是这...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值