本文介紹了幾個棧和遞迴的問題,當然遞迴的本質就是棧。這些問題網上都能找到解答,自己思考並實現了一下,供網友參考。
問題1:跳台階問題。具體描述,乙個台階總共有n級,如果一次可以跳1級,也可以跳2級。求總共有多少總跳法,並分析演算法的時間
雜度。
思路:簡單分析一下,這道題不難。假設f(n)為問題的解,從後往前推,最後一跳有兩種情況,一是跳1級,二是跳2級,可以得出這個式子 f(n) = f(n-1) + f(n-2),其中f(1)=1,f(2)=2。遞迴實現如下,當然也可以用迭代。
參考**:
[cpp]view plain
copy
print?
//函式功能 : 跳台階問題
//函式引數 : 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序列。
參考**:
[cpp]view plain
copy
print?
//函式功能 : 棧的push、pop序列
//函式引數 : ppush為push序列,ppop為pop序列,nlength為序列長度
//返回值 : 是否成立
bool
ispossiblepoporder(
const
int* ppush,
const
int* ppop,
intnlength)
//將棧中剩餘元素退棧
while
(!helpstack.empty())
else
break
; }
return
helpstack.empty() ?
true
: false
; }
問題3:二元樹的深度。
輸入一棵二元樹的根結點,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。例如:輸入二元樹: 10
/ \
6 14
/ / \
4 12 16
輸出該樹的深度3。二元樹的結點定義如下:
struct
sbinarytreenode // a node of the binary tree;
思路:這是一道關於樹的題目。很多樹的問題都是用遞迴解決的。比如「解題筆記(4)——
把二元查詢樹轉變成排序的雙向鍊錶
」、「解題筆記(6)——在二元樹中找出和為某一值的所有路徑(樹)
」、「解題筆記(7)——判斷整數序列是不是二元查詢樹的後序遍歷結果
」等。這個問題也不例外,只要遞迴求結點的左右子樹的深度,樹的深度為 = 1 + max。
參考**:
[cpp]view plain
copy
print?
//函式功能 : 二元樹的深度
//函式引數 : pnode指向樹的結點
//返回值 : 深度
intbinarytreedepth(binarytreenode *pnode)
} 問題4:顛倒棧。用遞迴顛倒乙個棧。例如輸入棧
,1在棧頂。顛倒之後的棧為
,5處在棧頂。
思路:這道題純粹是為了加深遞迴的理解。用兩個遞迴來做。
參考**:
[cpp]view plain
copy
print?
//函式功能 : 顛倒棧
//函式引數 : 要顛倒的棧
//返回值 : 無
template
<
typename
t>
void
reversestack(stack&srcstack)
} template
<
typename
t>
void
addtostackbottom(stack&srcstack, t x)
else
} 問題5:設計包含min函式的棧。
定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min、push以及pop的時間複雜度都是o(1)。
思路:利用雙棧來做。乙個棧用於正常的入棧退棧,稱為stack1
,另外乙個用於儲存棧的最小元素,稱為stack2。stack2入棧時,將入棧元素與stack2的棧頂元素比較,如果小於棧頂元素,則兩個棧同時執行入棧操作。stack1
退棧時,如果退棧元素與stack2的棧頂元素相等,則兩個棧同時執行出棧操作。下面是乙個簡單的實現。
參考**:
[cpp]view plain
copy
print?
template
<
class
t>
class
minstack
; template
<
class
t>
minstack::minstack()
template
<
class
t>
minstack::~minstack()
template
<
class
t>
bool
minstack::empty()
const
template
<
class
t>
void
minstack::push(t value)
template
<
class
t>
void
minstack::pop()
template
<
class
t>
const
t& minstack::min()
const
template
<
class
t>
t& minstack::top()
template
<
class
t>
const
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 ...