算法系列——逆置一個棧

題目描述

一個棧一次壓入了1、2、3、4、5,那麼從棧頂到棧底分別爲5、4、3、2、1.將這個棧轉置後,從棧頂到棧底爲1、2、3、4、5,

解題思路

空間複雜度爲O(n)

生成一個輔助棧,依次從原來棧中彈出壓入輔助棧中,返回最後結果。

遞歸方法

不利用輔助棧,遞歸調用取得棧底元素的子函數然後將其壓入原有棧中。空間複雜度爲O(1),時間複雜度爲O(n)

程序實現

public class Solution {

    /**
     * 逆置一個棧,O(n)時間,O(n)空間
     *
     * @param stack
     * @return
     */

    public Stack<Integer> reverseStack(Stack<Integer> stack) {

        Stack<Integer> res = new Stack<>();
        if (stack == null || stack.isEmpty())
            return res;
        while (!stack.isEmpty()) {
            res.add(stack.pop());
        }
        return res;
    }


    /**
     * 逆置一個棧,O(n)時間,O(1)空間
     *
     * @param stack
     * @return
     */


    public Stack<Integer> reverseStack1(Stack<Integer> stack) {
        if (stack == null || stack.isEmpty())
            return stack;

        int i = getAndRemoveBottomElement(stack);
        reverseStack1(stack);
        stack.push(i);

        return stack;

    }
    /**
     * 取得棧底元素
     *
     * @param stack
     * @return
     */

    private int getAndRemoveBottomElement(Stack<Integer> stack) {

        int result = stack.pop();
        if (stack.isEmpty())
            return result;
        int last = getAndRemoveBottomElement(stack);
        stack.push(result);
        return last;
    }

    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        System.out.println(stack);
        System.out.println(new Solution().reverseStack1(stack));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章