Java 杂谈程序员

栈问题之栈的反转

2018-03-06  本文已影响0人  jqdywolf

1. 可以使用O(N)空间

2. 只能使用O(1)空间

这个其实是很有趣的问题。解决方法是使用递归。
这里提供两种方法:

循环插入法

将栈顶元素插入栈中,循环(栈的元素个数-1)次,得到反转的栈。
栗子:

  1. 初试栈[1,2,3,4,5]
  2. 先把1插入栈底-倒数第一个位置,得到[2,3,4,5,1]
  3. 把2插入倒数第二个位置,得到[3,4,5,2,1]
    ......
    最终得到[5,4,3,2,1]
    注意:将一个元素插入栈的倒数第N个位置可以使用递归实现。
    实现代码如下
public class ReverseStack1 {

    static int insertStackBottomNPosition(String element, Stack<String> stack, int index) {
        if (stack.size() == 0) {
            return 0;
        }
        String tmp = stack.pop();
        int i = insertStackBottomNPosition(element, stack, index);
        if (i == index) {
            stack.push(element);
        }
        stack.push(tmp);
        return i+1;
    }

    static void reverseStack(Stack<String> stack) {
        for (int index = 0; index < stack.size()-1; index++) {
            String tmp = stack.pop();
            insertStackBottomNPosition(tmp, stack, index);
        }
    }

    public static void main(String[] arg) {
        Stack<String> stack = new Stack<>();
        stack.push("1");
        stack.push("2");
        stack.push("3");

        reverseStack(stack);
        System.out.println(stack);
    }
}
递归插入栈底法

反转方法:

  1. 首先我们pop拿到栈顶元素,然后接下来:
  2. 反转剩下的栈元素
  3. 将pop出来的栈顶元素插入栈底即可。
public class ReverseStack {

    static void insertStackBottom(String element, Stack<String> stack) {
        if (stack.size() == 0) {
            stack.push(element);
            return;
        }
        String top = stack.pop();
        insertStackBottom(element, stack);
        stack.push(top);
    }

    static void reverseStack(Stack<String> stringStack){
        if (stringStack.size() == 1) {
            return;
        }
        String tmp = stringStack.pop();
        reverseStack(stringStack);
        insertStackBottom(tmp, stringStack);
    }

    public static void main(String[] args) {
        Stack<String> stack = new Stack<>();
        stack.push("1");
        stack.push("2");
        stack.push("3");
        reverseStack(stack);
        System.out.println(stack);
    }
}
总结一下
上一篇下一篇

猜你喜欢

热点阅读