如何仅用递归函数和栈操作逆序一个栈——Java从0开始学习系列之路(4)

前言--

博主本打算把2,3题合并在一同一篇博文,但是第二题的题解写的有点长,如果合并在一起反而不利于阅读,so,另外写一篇文章来记录了(PS:我现在困得用音乐来提神了,回宿舍还有计算机组成,嵌入式应用的报告要写,还要口语的打卡,然后洗澡,洗衣服,想想就累 啊!!!,不过还是得好好坚持!)

 

如何仅用递归函数和栈操作逆序一个栈

题目:一个栈依次压入1.2.3.4.5,那么从栈顶的到栈底的元素就分别是5.4.3.2.1,如何通过递归函数把这个栈的元素逆序,使栈

顶到栈底的元素依次是1.2.3.4.5.

 

分析:这题我想了半小时,没想出来,然后看了下题解,感觉真的太妙了,一个getAndRemoveLast()的递归函数,作用是用来去除栈底的元素并返回栈底的元素。这个方法我真的想不出来,实在是太妙了,ORZ,不过这个姿势我记下了,以后多用使之转变为自己的。

附getAndRemoveLast()代码:

	public int getAndRemoveLast( Stack<Integer> stack ) {
		
		int value = stack.pop();
		int result;
		if(stack.empty()) {
			
			return value;
		}
		else {
			
	       result = getAndRemoveLast(stack);
	       
	       stack.push(value);
	       
	       return result;
	       
			
		}
		
		
		
	}

由于递归的理解完全取决于个人,我只能按我自己的理解给大家解释一下,首先这个函数的作用就是对于当前的栈,我把栈顶的

元素给pop了,如果pop完之后栈为空了,说明当前pop出去的元素就是栈底的元素了,那么就可以return 了。

如果pop完之后,剩余的栈还不为空,那么我们还需要对剩余的栈进行getAndRemoveLast。当返回该层次调用的时候,说明已经把剩余的栈的栈底元素给去除了并且返回了它的值,那么我此时应该把在这个层次Pop出去的数,给Push回去。

这样当我们返回第一层调用时,就已经把栈底的元素给去除了,而其他元素不变,是不是很妙!!!!!!

 

除了getAndRemoveLast()这个递归函数之外,我们还要设计一个Rverse()函数。

我在理解了第一个递归函数后,不用看书就能自己实现出第二个递归函数Reverse(),写完之后跟书对照了之后,发现都一样的,看来getAndRemoveLast()这个递归函数的设计才是难点!

附Reverse的代码:

	public void Reverse(Stack<Integer>stack) {
		
		
		int value = this.getAndRemoveLast(stack);
		
		if(stack.empty()){
			
			stack.push(value);
			return;
		}
			
			
			
		else {
			
			this.Reverse(stack);
		
		    stack.push(value);
		}
			
		
		
		
		
	}

分析Reverse():

其实很简单,我们要怎么对一个栈完成逆序呢?

首先,把这个栈的栈底元素去除并且先保留它的值,然后对剩余的栈实现Reverse(), 剩余部分Reverse()完成,意味着剩余的部分已经翻转,然后我们再push原先保留的栈底的元素,这样是不是就成功翻转了呢!  我这句话实际上就是描述了Reverse()的函数该如何设计,由于递归函数的理解完全取决于个人,请读者自行好好理解,必定大于好处!

 

Ps:滚回宿舍继续干活了~~~~~,顺便附上JAVA完整代码:

package code_180;

import java.util.*;
import java.util.Stack;
public class ReverseStack {

	private Stack<Integer> stack;
	
	ReverseStack(){
		
		this.stack = new Stack<Integer>();
	}
	
	public int getAndRemoveLast( Stack<Integer> stack ) {
		
		int value = stack.pop();
		int result;
		if(stack.empty()) {
			
			return value;
		}
		else {
			
	       result = getAndRemoveLast(stack);
	       
	       stack.push(value);
	       
	       return result;
	       
			
		}
		
		
		
	}
	
	public void Reverse(Stack<Integer>stack) {
		
		
		int value = this.getAndRemoveLast(stack);
		
		if(stack.empty()){
			
			stack.push(value);
			return;
		}
			
			
			
		else {
			
			this.Reverse(stack);
		
		    stack.push(value);
		}
			
		
		
		
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int []arrayTest = {1,2,3,4,5};
		
		ReverseStack myStack = new ReverseStack();
		
		for(int i = 0 ;i < 5 ;i++)
			myStack.stack.push(arrayTest[i]);
		
		
		myStack.Reverse(myStack.stack);
	
		
		while( !myStack.stack.empty()) {
			
			System.out.println(myStack.stack.peek());
			myStack.stack.pop();
		}
		
		

	}

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值