Java中的深入棧和淺入棧都是方法調用時的重要概念。
先講一下淺入棧,也叫做線性棧,是一種較為簡單的棧結構。當一個方法被調用時,該方法所需使用的局部變量都會放入棧中,而當方法執行完成后,進入棧中的數據也隨之退出。就像是自行車的單車車筐,你需要什么物品就放入車筐中,用完了就取出來,但車筐的大小有限,不能放置過多的物品。
與之相對的是深入棧,也叫做遞歸棧,是一種使用遞歸方法時所產生的棧結構。遞歸方法的執行流程與淺入棧不同,它會在方法內部多次調用自身,這時候需要存入多組參數,這些參數都在棧中的不同位置。相當于是一個俄羅斯套娃,一層套著一層,需要依次打開才能取出所需物品。而在Java中,深入棧的大小要比淺入棧要大得多,所以在使用遞歸方法時,需要注意深入棧的大小,否則會引發棧溢出錯誤。
//遞歸求階乘 public static int factorial(int n){ if(n==1){ return 1; }else{ return n*factorial(n-1);//遞歸調用自身 } }
在這段代碼中,當n為1時,遞歸方法factorial(n-1)會停止調用并返回1,而當n大于1時,遞歸會繼續向下調用,多組參數會同時存放于深入棧中,直到遞歸調用停止,一次性返回結果。
因此,在使用遞歸方法時,需要警惕深入棧是否超出計算機能夠支持的極限,否則會出現棧溢出錯誤(StackOverflowError)。如果需要使用遞歸方法,建議通過增加深入棧大小的方式來避免這個錯誤。
下一篇java注解和監聽