2014-12-22 24 views
-1

我必須遞歸地反轉堆棧。 使用相同的堆棧。如何將內置堆棧作爲參考傳遞給C++中的遞歸函數

void reverse(stack<int> *s) 
{ 

    if(s->empty()) 
    return; 
int element= s->top(); 
    s->pop(); 
    reverse(s); 
    s->push(element); 

} 
+1

'void反轉(堆棧&S)' – Borgleader

+0

我不明白,你有什麼問題。使用指針/引用的C++的算法或語法? – Youda008

+1

你最大的問題是你的棧沒有被reverse()函數取消。面對它:沿着堆棧彈出元素,然後反向推動它們會得到相同的堆棧。如果你想爲此提供解決方案,那麼你的問題就不清楚了。 – stefaanv

回答

0

我不知道是可能的LIFO結構,在你的代碼中刪除一個從頂部然後把它放到最上面,是沒有意義的,可能工作使用數組或其他堆棧parametar。爲了把東西放在第一位置堆棧需要是空的,或者你可以實現方法PushAtBottom,但它不會堆棧了,我想你會需要使用你自己的堆棧。

例子:

#include<iostream> 
template<class s> 
class stack 
{ 
     int top; 
     s* Array; 
     int counter; 
public: 
    stack(){ 
     top = 0; 
     Array = new s[10]; 
     counter = 0; 
    } 
    s Pop(){ 
     if(top!=0){ 
      s rTop = Array[top]; 
      Array[top] = NULL; 
      top--; 
      return rTop; 
     } 
     return NULL; 
    } 
    void Push(s item){ 
     top++; 
     Array[top] = item; 
    } 
    void PushAtBottom(s item){ 
     for(int i=top;i>counter;i--) 
     { 
      Array[i+1] = Array[i]; 
     } 
     Array[++counter] = item; 
     top++; 
    } 
    bool empty(){ 
     if(top!=0) 
      return false; 
     return true; 
    } 
    bool reverse_done(){ //funtion that stops recursion 
     if(counter >= top) 
      return true; 
     return false; 
    } 
}; 

void stack_reverse(stack<int> *s){ 
    if(s->reverse_done()) 
     return; 
    s->PushAtBottom(s->Pop()); 
    stack_reverse(s); 

} 

void main(){ 

    stack<int> * s = new stack<int>(); 
    s->Push(1); 
    s->Push(2); 
    s->Push(3); 
    stack_reverse(s); 
    std::cout << s->Pop(); 
    std::cout << s->Pop(); 
    std::cout << s->Pop(); 
} 
+0

代碼示例會有幫助嗎? – sarin

+0

@wedo謝謝!!我得到我想要的東西,這真的很有幫助。 –

相關問題