1. 程式人生 > >如何僅用遞迴函式和棧操作逆序一個棧(詳解版)

如何僅用遞迴函式和棧操作逆序一個棧(詳解版)

import java.util.Stack;


public class ReverseStack {
	/**
	 * 1、首先,取出棧頂元素
	 * 2、然後求剩下元素的最後一個元素
	 * 3、最後將棧頂元素放回
	 * 其中第二步為遞迴呼叫,遞迴終止條件是棧中只有一個元素,此時直接返回棧頂即可得到最後一個元素
	 */
	public static int getAndRemoveLastElement(Stack<Integer> stack){
		int res = stack.pop();
		if(stack.isEmpty()){
			return res;
		}
		int last = getAndRemoveLastElement(stack);
		stack.add(res);
		return last;
	}
	/**
	 * 1、取出並刪除棧低元素
	 * 2、翻轉剩下的元素
	 * 3、再將之前的棧低元素壓回棧頂
	 * 其中第二步為遞迴呼叫,遞迴終止條件是棧為空
	 */
	public static void reverse(Stack<Integer> stack){
		if(stack.isEmpty())
			return;
		int i = getAndRemoveLastElement(stack);
		reverse(stack);
		stack.add(i);
	}
	//測試程式碼
	public static void main(String[] args) {
		Stack<Integer> stack = new Stack<Integer>();
		stack.add(3);
		stack.add(1);
		stack.add(2);
		reverse(stack);
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack.pop());
	}

}