Hanoi Tower C ++ (using recursion)

As a practical exercise, I wrote the following code.
I get the wrong output when printing the target stack.
Can anyone point out where I'm wrong?

//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(); } 

Here's the output I get:

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

After editing, the code is as follows:

  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); } } 

first mistake:

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

second:

 if (disk==0) 

Many thanks to all for your help!


Changes to the stack class:

 void push(int d) { if(top<length-1) { top++; t[top]=d; } } int pop() { if(top>-1) { top--; return t[top+1]; } } 
+4
source share
1 answer

It works:

 //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; } 
+2
source

Source: https://habr.com/ru/post/1498949/


All Articles