2013-08-26 200 views
4

我寫了下面的代碼作爲練習練習。
當我打印目標堆棧時,出現錯誤輸出。
任何人都可以請指出我要去哪裏錯了嗎?河內C++塔(使用遞歸)

//Tower of Hanoi using Stacks! 
#include<iostream.h> 
#include<conio.h> 
#include<stdlib.h> 

class Stack 
{ 
private: 
    int *t; 
    int length, top; 

public: 
    Stack(int len) 
    { 
     length=len; 
     t= new int[len]; 
     top=-1; 
    } 

    ~Stack() 
    { 
     delete []t; 
    } 

    void push(int d) 
    { 
     top++; 
     t[top]=d; 
    } 

    int pop() 
    { 
     top--; 
     return t[top+1]; 
    } 

    void printstack() 
    { 
     int cur=top; 
     while(cur>-1) 
     { 
      cout<<t[cur]<<endl; 
      cur--; 
     } 
    } 
}; 

void MoveTowerofHanoi(int disk, Stack *source, Stack *temp, Stack *destination) 
{ 
    if (disk==0) 
    { 
     destination->push(source->pop()); 
    } 
    else 
    { 
     MoveTowerofHanoi(disk-1,source,temp,destination); 
     destination->push(source->pop()); 
     MoveTowerofHanoi(disk-1,temp,destination,source); 
    } 
} 

void main() 
{ 
    clrscr(); 
    int disks; 
    cout<<"Enter the number of disks!"<<endl; 
    cin>>disks; 
    Stack* source=new Stack(disks); 
    for(int i=0; i<disks; i++) { 
     source->push(disks-i); 
    } 
    cout<<"Printing Source!"<<endl; 
    source->printstack(); 
    Stack* temp=new Stack(disks); 
    Stack* destination=new Stack(disks); 
    MoveTowerofHanoi(disks,source,temp,destination); 
    cout<<"Printing Destination!"<<endl; 
    destination->printstack(); 
    getch(); 
} 

這裏是我得到的輸出:

Enter the no. of disks! 
3 
Printing Source! 
1 
2 
3 
Printing Destination! 
-4 

編輯之後,代碼如下:

void MoveTowerofHanoi(int disk, Stack *source, Stack *destination, Stack *temp) 
{ 
    if (disk==1) 
    { 
     destination->push(source->pop()); 
    } 
    else 
    { 
     MoveTowerofHanoi(disk-1,source,temp,destination); 
     destination->push(source->pop()); 
     MoveTowerofHanoi(disk-1,temp,destination,source); 
    } 
} 

的第一個錯誤是:

void MoveTowerofHanoi(int disk, Stack *source, Stack *temp, Stack *destination) 

第二個是:

if (disk==0) 

非常感謝大家的幫助!


變化作出Stack類:

void push(int d) 
{ 
    if(top<length-1) 
    { 
    top++; 
    t[top]=d; 
    } 

} 

int pop() 
{ 
    if(top>-1) 
    { 
    top--; 
    return t[top+1]; 
    } 
} 
+3

你絕對不需要任何指針在'main',它必須返回'int',不'void',如果重點是河內塔,爲什麼不能使用'std :: stack'?另外,'iostream.h'不是,並且從來不是標準頭文件。 – chris

+0

你在類定義之後缺少一個分號,它甚至不應該編譯。而你的縮進就是,你沒有縮進,這使得代碼很難閱讀。 –

+0

@JoachimPileborg修復了縮進,但我沒有添加分號 – nijansen

回答

2

這工作:

//Tower of Hanoi using Stacks! 
#include<iostream> 
//#include<conio.h> 
#include<stdlib.h> 
#include<vector> 
#include<algorithm> 
using namespace std; 

void print_elem(int elem) 
{ 
    cout << elem << endl;  
} 

class Stack{ 
public: 
    void push(int d){t.push_back(d);} 
    int pop() 
    { 
     int d=t.back(); 
     t.pop_back(); 
     return d; 
    } 
    void printstack() 
    { 
     for_each(t.rbegin(),t.rend(),print_elem); 
    } 
private: 
    vector<int> t; 

}; 

void MoveTowerofHanoi(int disk, Stack *source, Stack *temp, Stack *destination) 
{ 
    if (disk==1) 
    { 
     destination->push(source->pop()); 
    } 
    else 
    { 
     MoveTowerofHanoi(disk-1,source,destination,temp); 
     destination->push(source->pop()); 
     MoveTowerofHanoi(disk-1,temp,source,destination); 
    } 
} 

int main() 
{ 
    int disks; 
    cout<<"Enter the number of disks!"<<endl; 
    cin>>disks; 
    Stack* source = new Stack(); 
    for(int i=disks; i>0; --i) { 
     source->push(i); 
    } 

    cout<<"Printing Source!"<<endl; 
    source->printstack(); 
    Stack* temp = new Stack(); 
    Stack* destination = new Stack(); 
    MoveTowerofHanoi(disks,source,temp,destination); 
    cout<<"Printing Destination!"<<endl; 
    destination->printstack(); 
    delete source; 
    delete temp; 
    delete destination; 
} 
+1

主要泄漏。 –

+0

@NeilKirk,thanx,已修復。 – cpp

+0

請注意,對於河內塔,您不能在任何一個堆疊上放置較大的磁盤。因此ToH的堆棧類可以強制執行此約束,從而爲算法提供更嚴格的測試。堆棧類還可以確保只有值1..length被放置在堆棧上 - 再次,特定於ToH問題的約束。當然,當算法是正確的時候,額外的檢查並沒有什麼幫助,但是當它被打破時,這可能會非常有幫助。 –