解題筆記(15) 幾個棧和遞迴的問題

2021-05-26 22:44:33 字數 3019 閱讀 4330

本文介紹了幾個棧和遞迴的問題,當然遞迴的本質就是棧。這些問題網上都能找到解答,自己思考並實現了一下,供網友參考。

問題1:跳台階問題。

具體描述,乙個台階總共有n級,如果一次可以跳1級,也可以跳2級。求總共有多少總跳法,並分析演算法的時間

雜度。思路:簡單分析一下,這道題不難。假設f(n)為問題的解,從後往前推,最後一跳有兩種情況,一是跳1級,二是跳2級,可以得出這個式子 f(n) = f(n-1) + f(n-2),其中f(1)=1,f(2)=2。遞迴實現如下,當然也可以用迭代。

//函式功能 : 跳台階問題

//函式引數 : n為台階個數

//返回值 : 總的跳法

unsigned jumpsteps_solution1(unsigned n)

unsigned jumpsteps_solution2(unsigned n)

return sum;

}

問題2:棧的push、pop序列。具體描述,輸入兩個整數序列。其中乙個序列表示棧的push順序,判斷另乙個序列有沒有可能是對應的pop順序。為了簡單起見,我們假設push序列的任意兩個整數都是不相等的。

比如輸入的push序列是1、2、3、4、5,那麼4、5、3、2、1就有可能是乙個pop系列。因為可以有如下的push和pop序列:

push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,這樣得到的pop序列就是4、5、3、2、1。

但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。

思路:用乙個輔助棧。依次檢查push序列的每個元素,如果該元素不等於pop序列的當前元素,則將這個元素壓棧;如果相等,則檢查push序列的下乙個元素,同時pop序列的當前元素往前移1個。最後將輔助棧中的元素退棧,並與pop序列進行比較。最後輔助棧的元素為空,並且pop序列的當前位置為最後元素的下乙個位置,則這個序列是pop序列。

參考**:

//函式功能 : 棧的push、pop序列

//函式引數 : ppush為push序列,ppop為pop序列,nlength為序列長度

//返回值 : 是否成立

bool ispossiblepoporder(const int* ppush, const int* ppop, int nlength)

//將棧中剩餘元素退棧

while(!helpstack.empty())

else

break;

} return helpstack.empty() ? true : false;

}

問題3:二元樹的深度。

輸入一棵二元樹的根結點,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。例如:輸入二元樹:

10/\

614/

/   \

412 16

輸出該樹的深度3。二元樹的結點定義如下:

struct

sbinarytreenode // a node of the binary tree

;思路:這是一道關於樹的題目。很多樹的問題都是用遞迴解決的。比如「解題筆記(4)——

把二元查詢樹轉變成排序的雙向鍊錶

」、「解題筆記(6)——在二元樹中找出和為某一值的所有路徑(樹)

」、「解題筆記(7)——判斷整數序列是不是二元查詢樹的後序遍歷結果

」等。這個問題也不例外,只要遞迴求結點的左右子樹的深度,樹的深度為 = 1 + max。

參考**:

//函式功能 : 二元樹的深度

//函式引數 : pnode指向樹的結點

//返回值 : 深度

int binarytreedepth(binarytreenode *pnode)

}

問題4:顛倒棧。用遞迴顛倒乙個棧。例如輸入棧,1

在棧頂。顛倒之後的棧為,5

處在棧頂。

思路:這道題純粹是為了加深遞迴的理解。用兩個遞迴來做。

參考**:

//函式功能 : 顛倒棧

//函式引數 : 要顛倒的棧

//返回值 : 無

templatevoid reversestack(stack&srcstack)

}templatevoid addtostackbottom(stack&srcstack, t x)

else

}

問題5:設計包含min函式的棧。

定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min、push以及pop的時間複雜度都是o(1)。

思路:利用雙棧來做。乙個棧用於正常的入棧退棧,稱為stack1

,另外乙個用於儲存棧的最小元素,稱為stack2。stack2入棧時,將入棧元素與stack2的棧頂元素比較,如果小於棧頂元素,則兩個棧同時執行入棧操作。stack1

退棧時,如果退棧元素與stack2的棧頂元素相等,則兩個棧同時執行出棧操作。下面是乙個簡單的實現。

templateclass minstack

;templateminstack::minstack()

templateminstack::~minstack()

templatebool minstack::empty() const

templatevoid minstack::push(t value)

templatevoid minstack::pop()

templateconst t& minstack::min() const

templatet& minstack::top()

templateconst t& minstack::top() const

解題筆記(15) 幾個棧和遞迴的問題

本文介紹了幾個棧和遞迴的問題,當然遞迴的本質就是棧。這些問題網上都能找到解答,自己思考並實現了一下,供參考。問題1 跳台階問題。具體描述,乙個台階總共有n級,如果一次可以跳1級,也可以跳2級。求總共有多少總跳法,並分析演算法的時間 雜度。思路 簡單分析一下,這道題不難。假設f n 為問題的解,從後往...

解題筆記(13) 幾個鍊錶的問題

鍊錶的一些問題經常會在面試中出現,這類題目能很好的反映出程式設計師的程式設計基本功,以及思維的縝密程度。寫 之前,最好能仔細分析一下題目,列出關鍵點。其實思路是最重要的,思路如果正確,實現不是問題,更像是乙個翻譯的過程。下面是4道關於鍊錶的題目,網上都有思路解答。自己實現了一下,供參考。下面各題的鍊...

棧和遞迴 解決迷宮問題

走過的路設定為2,未走過的路設定0,牆設定為1 如下 bool checkpath const pos cur bool getmazepath pos entry pos next cur 上next.row 1 if checkpath next next cur 右next.col 1 if ...