程式設計師演算法與資料結構基礎中的基礎,棧與遞迴

2021-09-22 16:31:55 字數 1201 閱讀 1559

棧是一種基礎的資料結構,每次操作的都是棧頂的資料。我們稱棧頂的方向為上,棧底的方向為下,只有上面的元素已經出棧了,下面元素才能出棧,我們稱之為先進後出。好比這個圖中健身器材,這實際上就是乙個棧,最小最上面的那塊鐵最後安裝進去,卻最先被取出來,最大的那個鐵圈,最早安裝進去,最晚取出來。(找了好久才找到乙個現實生活中常見又大眾的例子,作為乙個程式設計師,生活真的是比較單調)

棧是一種支援push跟pop兩種資料結構,他的基本操作如下圖所示,每次push操作,實際上都是往棧的上方插入乙個元素,pop操作,則是把棧最上方的元素彈出來。

那麼這個棧跟我們要講的遞迴到底是什麼關係呢?我們先看一看這個問題,求乙個數的階乘,乙個正整數的階乘是1到它本身所有正整數的乘積,我們用遞迴的方式來實現這個功能。

這個**在作業系統裡面是怎麼執行的呢,作業系統本身就有乙個執行時候的棧。我們假設求5的階乘,作業系統執行到第5行,發現這是乙個遞迴,就會把它加到系統棧裡面,並且記錄下我在執行fact方法,x等於5,執行到第5行,然後開始計算4,執行到第5行,發現是個遞迴,又把他記錄到系統棧裡面,記錄下,正在執行fact方法,x等於4,計算到第5行。。。直到執行到x等於1,然後退出,系統開始退棧,回到剛才x等於2的時候,從第5行開始執行,然後執行第6行,接著退出,執行x=3的時候。。。最後,到了棧底x=5,計算完之後棧沒有元素了,整個方法執行完畢!

我們常常說暴棧,也就是stack overflow,說的就是系統棧溢位,造成這種問題的一般原因都是因為遞迴沒有退出條件!所以作業系統不停遞迴,類似與死迴圈。上述例子中,當x等於的時候就退出,就是退出條件。另外一種可能,是本身資料量就非常大,也有可能會造成stack overflow,這種一般的解決方法也有三種,一是增大系統棧空間,二是使用非遞迴的方法,三是減少遞迴過程中棧空間的使用。

好了,今天的演算法我們就講到這裡,相信你再閱讀下面的動態規劃演算法跟深度優先搜尋演算法,會有進一步的理解。有什麼疑問可以隨時提出。

被程式設計師鄙視的程式 資料結構與演算法

今天看到的乙個很有趣的求解過程,題目如下 求和f x a 0 a 1 x a n 1 x n 1 a n x n 解法一 直接求解 如下 計算多項式f x a 0 a 1 x a n 1 x n 1 a n x n double f1 double a,double x,int n 所得到的結果是沒...

PHP 程式設計師學資料結構與演算法之《棧》

介紹 要成高手,必練此功 要成為優秀的程式設計師,資料結構和演算法是必修的內容。而現在的web程式設計師使用傳統演算法和資料結構都比較少,因為很多演算法都是包裝好的,不用我們去操心具體的實現細節,如php的取棧操作array pop,進棧操作array push,都有指定的庫函式,導致我們對基礎演算...

資料結構與演算法 Redis中LRU演算法的基本思想

lru least recently used 是一種快取置換演算法。即在快取有限的情況下,如果有新的資料需要載入進快取,則需要將最不可能被繼續訪問的快取剔除掉。下面總結一下核心操作的步驟 class dlinkednodelru cache public class lrucache public...