在競賽中如果系統棧很小的話,過深的遞迴會讓棧溢位,這個時候我們就要自己手寫棧,將遞迴轉化成手工棧。
方法其實也很簡單。
基本思路上,我們就是用棧不斷的pop,push。但是何時push,何時pop呢?
在《演算法導論》上對深度優先遍歷樹的講解中,在深度遍歷中,會對每個節點進行染色,白色為沒有被訪問過;灰色為被訪問過,但是該節點的所有子樹還沒有完成訪問;黑色,節點被訪問過,而且該節點的所有子樹都被完全的訪問。
所以,我們就通過顏色標記來進行判斷了。
整體的框架如下:
memset(vis,0,sizeof(vis));
stack s;
s.push(root)
while(!s.empty())
else
if(vis[u] == 0)// if node is white, then color gray
}
遞迴轉化成棧的非遞迴的區別
遞迴的 量比非遞迴的 量少 因為非遞迴需要額外的變數記錄當前所處的位置資訊,以及額外的控制語句。而遞迴所使用的方式是函式呼叫,這是非常自然的棧結構,遞迴每深入一層,棧的深度也會加一,而且當每一層的遞迴呼叫結束,都會自動返回上一層的遞迴中,不需要記錄位置資訊,不需要新增控制語句,這些工作都由函式呼叫的...
用棧實現Fibnacci遞迴過程的非遞迴演算法
include include using namespace std 模擬遞迴工作棧。data表示當前狀態的引數值 state表示當前棧的完成狀態,state 2 表示未計算,state 1 表示計算了遞迴樹左部,state 0 表示計算了整個遞迴子樹 struct stacknode stack...
用遞迴操作逆序棧 遞迴
乙個棧依次壓入1,2,3,4,5那麼從棧頂到棧底分別為5,4,3,2,1。將這個棧轉置後,從棧頂到棧底為1,2,3,4,5,也就是實現了棧中元素的逆序,請設計乙個演算法實現逆序棧的操作,但是只能用遞迴函式來實現,而不能用另外的資料結構。給定棧的大小n和乙個棧stack,請返回逆序後的棧。測試樣例 5...