如何僅用遞歸函數和棧操作逆序一個棧——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();
		}
		
		

	}

}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章