資料結構 用棧來將遞迴轉換成迴圈

2021-09-22 18:24:35 字數 586 閱讀 3165

為什麼將遞迴轉換成迴圈需要用到棧?

遞迴其實是在每次呼叫自己來進入新的狀態,直到最後一次的狀態能夠滿足遞迴的結束條件,然後返回到上次的狀態。我們都知道棧有著後進先出的特性,那這樣是不是就可以理解為遞迴每呼叫一層就壓入棧,直到最後滿足遞迴結束條件,再一層層彈出棧,那麼用棧來將遞迴改為迴圈,就可以理解了。

下面我們看乙個例子,逆序列印鍊錶:

遞迴實現:

void reverseprint(node* phead) 

}

用棧來實現:

void reverseprint(node* phead) 

stack s;

stackinit(&s);

node* pcur = phead;//遍歷鍊錶,將鍊錶中元素放到棧中

while (pcur)

//將棧中所有元素列印

while (stackempty(&s))

stackdestory(&s);

}

用c語言中棧來實現的話,前面還需要封裝乙個棧哦,我這裡沒有寫,直接拿來用了。

3 4 4 利用棧將遞迴轉換成非遞迴的方法

在函式執行時系統需要設立乙個 遞迴工作棧 儲存第一層遞迴所需的資訊,此工作棧是遞迴函式執行的輔助空間,所以可以看出,遞迴程式在執行時需要系統提供隱式棧這種資料結構來實現,對於一般的遞迴過程,仿照遞迴演算法執行過程中遞迴工作棧的狀態變化可直接寫出相應的非遞迴演算法。這種利用棧消除遞迴過程的步驟如下。1...

PHP將資料集轉換成樹狀結構

把返回的資料集轉換成tree param array list 要轉換的資料集 param string pid parent標記字段 param string level level標記字段 return array function list to tree list,pk id pid pid...

mktime(將時間結構資料轉換成經過的秒數)

mktime 將時間結構資料轉換成經過的秒數 表頭檔案 include 定義函式 time tmktime strcut tm timeptr 函式說明 mktime 用來將引數timeptr所指的tm結構資料轉換成從公元1970年1月1日0時0分0 秒算起至今的utc時間所經過的秒數。返回值返回經...