我寫了下面的代碼作爲練習練習。
當我打印目標堆棧時,出現錯誤輸出。
任何人都可以請指出我要去哪裏錯了嗎?河內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];
}
}
你絕對不需要任何指針在'main',它必須返回'int',不'void',如果重點是河內塔,爲什麼不能使用'std :: stack'?另外,'iostream.h'不是,並且從來不是標準頭文件。 – chris
你在類定義之後缺少一個分號,它甚至不應該編譯。而你的縮進就是,你沒有縮進,這使得代碼很難閱讀。 –
@JoachimPileborg修復了縮進,但我沒有添加分號 – nijansen