如何递归地将堆栈的顶部元素交换到底部

时间:2017-04-11 02:31:37

标签: java recursion stack reverse swap

我想知道如何递归地将堆栈的顶部元素交换到底部。 堆栈应该看起来像这样:

4 (top)
3
2
1

成为

3 (top)
2
1
4

我想出了反转堆栈顺序的递归函数。但我只是坚持尝试只为一个人做这件事。我假设它与改变基本情况有关。

public void roll() {

    if (!isEmpty()){
        E temp = getBottom(this);
        roll();
        this.push(temp);
    }

}

private E getBottom(LinkedStack<E> p){
    E temp = p.pop();
    if (p.isEmpty()){
        return temp;
    } else {
        E temp2 = getBottom(p);
        p.push(temp);
        return temp2;
    } 
}

2 个答案:

答案 0 :(得分:1)

我实际上更喜欢迭代地执行它,但是因为你已经指定了递归,你可以通过反转堆栈然后再部分反转来实现。更简单的是直接将顶部元素发送到底部:

public void sendTopToBottom() {

    if (!isEmpty()){
        sendToBottom(pop());
    }

}

private void sendToBottom(E victim){
    if (isEmpty()){
        push(victim);
    } else {
        E temp = pop();
        sendToBottom(victim);
        push(temp);
    } 
}

答案 1 :(得分:0)

你只需交换前两个元素,然后将第二个顶部元素留在外面,交换掉所有元素后再推回该元素。例如:

    public void roll(Stack<Integer> stack) {
        if (stack.size() <= 1) {
            return;
        }
        Integer top1 = stack.pop();
        Integer top2 = stack.pop();
        stack.push(top1);
        roll(stack);
        stack.push(top2);
    }