遞迴函式的棧表達

2021-07-05 20:17:52 字數 999 閱讀 3683

void recursive(m)

r(m);

if m in a:

p(m); recursive(l(m));

q(m);recursive(r(m));

s(m);

else:

ret(m);

分兩類操作

1.cws 表示當前工作棧的引數m 如果cws滿足in a 將能新增的左子結點全部新增入棧中,之後將尾部的不符合in a的執行 pop掉之後再加入該節點的父節點的右節點 最終cws一定是右節點

2.不滿足in a的cws一定不能再遞迴(不然在while中會繼續迴圈)此時只需要執行r(cws);ret(cws);後就可pop掉 此時執行的棧就是r(st.top())=cws的st.top()了 之後再繼續執行右節點是pop掉的棧的所有棧即可

stack st;    st.push(root);      cws=root;

while(!st.empty()):

if(cws in a):

while(cws in a):

r(cws); p(cws); cws=l(cws); st.push(cws);

r(cws); ret(cws); st.pop();

if(!st.empty()):

cws=st.top(); q(cws); cws=r(cws); st.push(cws);

else:

r(cws); ret(cws); st.pop();

if(!st.empty()):

while(cws==r(st.top())):

cws=st.top(); s(cws); st.pop();

if(st.empty()):

break;

if(!st.empty()):

cws=st.top(); q(cws);

cws=r(cws);st.push(cws);

遞迴函式與棧

關於函式呼叫與棧的關係 鏈結 下面是在函式呼叫與棧的關係的基礎上,為了解遞迴呼叫的筆記。為了方便描述,將乙個函式f x 的棧幀以下圖的方式進行簡化 並用乙個求階乘的函式來解釋遞迴函式與棧的聯絡 int fun int n intmain int argc,char argv 首先程式從主函式開始,第...

函式遞迴與棧的實用

問題 求斐波那契數列的遞迴方法與非遞迴方法 棧是一種應用範圍廣泛的資料結構,適用於各種具有 後進先出 特性的問題。遞迴函式是指在乙個函式 過程或資料結構的定義中又應用了它自身的函式。include include using std cout using std endl using std sta...

逆波蘭表示式(棧,遞迴)

總時間限制 1000ms 記憶體限制 65536kb 描述逆波蘭表示式是一種把運算子前置的算術表示式,例如普通的表示式2 3的逆波蘭表示法為 2 3。逆波蘭表示式的優點是運算子之間不必有優先順序關係,也不必用括號改變運算次序,例如 2 3 4的逆波蘭表示法為 2 3 4。本題求解逆波蘭表示式的值,其...