我想知道如何递归地将堆栈的顶部元素交换到底部。 堆栈应该看起来像这样:
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;
}
}
答案 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);
}