用栈实现Fibnacci递归过程的非递归算法

  1. </pre><pre name="code" class="cpp">#include<iostream>  
  2. #include <stack>  
  3. using namespace std;  
  4.   
  5. //模拟递归工作栈。  
  6. //data表示当前状态的参数值  
  7. //state表示当前栈的完成状态,state = 2 表示未计算, state = 1 表示计算了递归树左部,state = 0 表示计算了整个递归子树  
  8. struct stackNode  
  9. {  
  10.     int data;  
  11.     int state;  
  12.     stackNode()  
  13.     {  
  14.         data =  0;  
  15.         state = 2;  
  16.     }  
  17.     stackNode( int d, int s)  
  18.     {  
  19.         data =  d;  
  20.         state = s;  
  21.     }  
  22. };  
  23.   
  24. int Fibnacci( int n )  
  25. {  
  26.     stack<stackNode> fstack;  
  27.     int res = 0;  
  28.     if( n < 0 )  
  29.     {  
  30.         return res;  
  31.     }  
  32.     fstack.push( stackNode( n, 2) );  
  33.   
  34.     while( !fstack.empty() )  
  35.     {  
  36.         if( fstack.top().state == 0)  
  37.         {  
  38.             fstack.pop();  
  39.             if( !fstack.empty() )  
  40.             {  
  41.                 fstack.top().state -= 1;  
  42.             }  
  43.         }else if( fstack.top().state == 2 )  
  44.         {  
  45.             if( fstack.top().data > 1 )  
  46.             {  
  47.                 fstack.push( stackNode( fstack.top().data - 1 , 2) );  
  48.             }else if( fstack.top().data == 1 )  
  49.             {  
  50.                 res += 1;  
  51.                 fstack.pop();  
  52.                 if( !fstack.empty() )  
  53.                 {  
  54.                     fstack.top().state -= 1;  
  55.                 }  
  56.             } else if( fstack.top().data == 0 )  
  57.             {  
  58.                 res += 0;  
  59.                 fstack.pop();  
  60.                 if( !fstack.empty() )  
  61.                 {  
  62.                     fstack.top().state -= 1;  
  63.                 }  
  64.             }  
  65.         }else if( fstack.top().state == 1 )  
  66.         {  
  67.             fstack.push( stackNode( fstack.top().data - 2 , 2) );  
  68.         }  
  69.     }  
  70.     return res;  
  71. }  
  72. int main()  
  73. {  
  74.     for( int i = -1 ; i< 10 ; i++)  
  75.     {  
  76.         cout<<Fibnacci(i)<<endl;  
  77.     }  
  78.     return 0;  
  79. }  

 

posted @ 2017-05-29 16:19  天涯海角路  阅读(522)  评论(0)    收藏  举报