Question: Please help with moveDisk and isPuzzleSolved functions to be used to help user make moves and solve a tower of hanoi puzzle given this program

Please help with moveDisk and isPuzzleSolved functions to be used to help user make moves and solve a tower of hanoi puzzle given this program class Stack {
public:
Stack();
~Stack();
bool isEmpty();
bool isFull();
void push(int val);
int pop();
int count();
int peek(int pos);
void change(int pos, int val);
void display();
private:
int top;
int arr[4];
};
using namespace std;
Stack::Stack(){
top =-1;
for (int i =0; i <4; i++){
arr[i]=0;
}
}
Stack::~Stack(){}
bool Stack::isEmpty(){
if(top ==-1){
cout <<" is empty" << endl;
return true;
}
else{
cout <<" is not empty." << endl;
return false;
}
}
bool Stack::isFull(){
if(top ==3){
cout <<" is full." << endl;
return true;
}
else{
cout <<"is not full." << endl;
return false;
}
}
void Stack::push(int val){
if (isFull()){
cout << "Overflow" << endl;
} else {
top++;
arr[top]= val;
}
}
int Stack::pop(){
if (isEmpty()){
cout << "Stack underflow" << endl;
return 0;
} else {
int popValue = arr[top];
arr[top]=0;
top--;
return popValue;
}
}
int Stack::count(){
return (top +1);
}
int Stack::peek(int pos){
if (isEmpty()){
cout << "Stack underflow" << endl;
return 0;
} else {
return arr[pos];
}
}
void Stack::change(int pos, int val){
arr[pos]= val;
cout << "Value changed at position "<< pos << endl;
}
void Stack::display(){
cout << "All items in stack are:" << endl;
for (int i = top; i >=0; i--){
cout << arr[i]<< endl;
}
}
void towerOfHanoi(int disks, Stack &source, Stack &auxiliary, Stack &destination){
if (disks ==1){
int disk = source.pop();
destination.push(disk);
cout << "Move disk "<< disk <<" from Tower "<< &source <<" to Tower "<< &destination << endl;
return;
}
towerOfHanoi(disks -1, source, destination, auxiliary);
int disk = source.pop();
destination.push(disk);
cout << "Move disk "<< disk <<" from Tower "<< &source <<" to Tower "<< &destination << endl;
towerOfHanoi(disks -1, auxiliary, source, destination);
}
void moveDisk(Stack& towerA, Stack& towerB, Stack& towerC, int fromTower, int toTower){
int top1, top2;
if (fromTower =='A')
top1= towerA.pop();
else if (fromTower =='B')
top1= towerB.pop();
else if (fromTower =='C')
top1= towerC.pop();
if (toTower =='A')
top2= towerA.pop();
else if (toTower =='B')
top2= towerB.pop();
else if (toTower =='C')
top2= towerC.pop();
if (top1==0)
towerA.push(top2);
else if (top2==0)
towerA.push(top1);
else if (top1> top2){
if (fromTower =='A' && toTower =='B')
towerB.push(top1);
else if (fromTower =='B' && toTower =='A')
towerA.push(top1);
else if (fromTower =='A' && toTower =='C')
towerC.push(top1);
else if (fromTower =='C' && toTower =='A')
towerA.push(top1);
else if (fromTower =='B' && toTower =='C')
towerC.push(top1);
else if (fromTower =='C' && toTower =='B')
towerB.push(top1);
} else {
if (fromTower =='A' && toTower =='B')
towerB.push(top2);
else if (fromTower =='B' && toTower =='A')
towerC.push(top2);
else if (fromTower =='A' && toTower =='C')
towerC.push(top2);
}
}
bool isPuzzleSolved(const Stack& towerC, int numDisks){
return 0;
}
int main(){
switch (choice){
case 1:
// Self-solving program
towerOfHanoi(numDisks, towerA, towerB, towerC);
break;
case 2:
// Help the user move discs between towers as directed
int fromTower, toTower;
while (!isPuzzleSolved(towerC, numDisks)){
cout << "Enter the move (e.g., A B to move a disk from Tower A to Tower B): ";
cin >> fromTower >> toTower;
moveDisk(towerA, towerB, towerC, fromTower, toTower);
}
std::cout << "Congratulations! You solved the puzzle." << std::endl;
break;
default:
std::cout << "Invalid choice" << std::endl;
break;
}
}
return 0;
}

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!