如何僅用遞迴函式和棧操作逆序一個棧——你要先用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());
}
}