1. 程式人生 > >如何僅用遞迴函式和棧操作逆序一個棧——你要先用stack實現,再去改成遞迴——需要對遞迴理解很深刻才能寫出來

如何僅用遞迴函式和棧操作逆序一個棧——你要先用stack實現,再去改成遞迴——需要對遞迴理解很深刻才能寫出來

/**
 * 如何僅用遞迴函式和棧操作逆序一個棧
 * 題目:
 * 一個棧依次壓入1,2,3,4,5,那麼從棧頂到棧底分別為5,4,3,2,1。
 * 將這個棧轉置後,從棧頂到棧底為1,2,3,4,5,也就是實現棧中元素的逆序,
 * 但是隻能用遞迴函式來實現,不能用其他資料結構。
 *
 */

方法一:

既然是遞迴,第一反應是採用兩個棧實現該功能實現,依次彈出棧頂元素,然後壓入另外一個棧中,程式碼如下:
    import java.util.Stack;
  
    public class StackReverse0 {
        private Stack<Integer> stack0;
        private Stack<Integer> stack1;
        
        public StackReverse0(){
            stack0 = new Stack<Integer>();
            stack1 = new Stack<Integer>();
        }
        public void getLastElement(){
            Integer pop = stack0.pop();
            stack1.push(pop);
            if(!stack0.isEmpty())
                getLastElement();
        }
        
        public static void main(String[] args) {
            StackReverse0 sr = new StackReverse0();
            sr.stack0.add(1);
            sr.stack0.add(2);
            sr.stack0.add(3);
            sr.stack0.add(4);
            sr.stack0.add(5);
            
            sr.getLastElement();
            
            System.out.println(sr.stack1.pop());
            System.out.println(sr.stack1.pop());
            System.out.println(sr.stack1.pop());
            System.out.println(sr.stack1.pop());
            System.out.println(sr.stack1.pop());
        }
    }

方法2:類似兩個stack的思路,不過是使用一個stack搞定。

import java.util.Stack;
public class StackReverse {
    public static int getAndRemoveLastElement(Stack<Integer> stack){ //負責刪除stack bottom的一個元素,並返回
        int result = stack.pop();
        if(stack.isEmpty()){
            return result;
        }else{
            int last = getAndRemoveLastElement(stack);
            stack.push(result);  // stack還原
            return last;
        }
    }
    
    public static void reverse(Stack<Integer> stack){
        if(stack.isEmpty()){
            return;
        }
        int i = getAndRemoveLastElement(stack);
        reverse(stack);
        stack.push(i); // 效果就是依次將stack top的元素入棧,最後效果就是stack元素逆序
    }
    
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<Integer>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        reverse(stack);
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
    }
}