一、題目
題目描述
一個棧依次壓入1,2,3,4,5那麼從棧頂到棧底分別爲5,4,3,2,1。
將這個棧轉置後,從棧頂到棧底爲1,2,3,4,5,也就是實現了棧中元素的逆序,
請設計一個算法實現逆序棧的操作,但是隻能用遞歸函數來實現,而不能用另外的數據結構。
給定一個棧Stack以及棧的大小top,請返回逆序後的棧。
測試樣例:
二、分析
一個數列1,2,3,4,5,如果想變成5,4,3,2,1,可通過以下方式得到。
1與5對換,此時爲5,2,3,4,1
2與4對換,此時爲5,4,3,2,1
1、通過以上兩步可以找到遞歸的邊界情況,當對換的次數超過數列長度的一半時,即結束。
2、遞歸函數的作用是完成一次對換。
public class YongDiGuiHanShuHeZhan {
public static int[] reverseStackRecursively(int[] stack, int top) {
reverse(stack, 0);
return stack;
}
/**
*
* @param stack 要翻轉的數組
* @param index 翻轉次數
*/
public static void reverse(int []stack,int index){
if(index>=stack.length/2){//邊界情況
return;
}
//完成一次交換
int temp=stack[index];
stack[index]=stack[stack.length-index-1];
stack[stack.length-index-1]=temp;
reverse(stack, index+1);//
}
public static void main(String[] args) {
int a[]={1,2,3,4,5};
int b[]=reverseStackRecursively(a,5);
for(int i=0;i<b.length;i++){
System.out.print(b[i]);
}
}
}
There’s always a bit of something hidden when you say nothing.