Biblioteca iStack.h
#ifndef ISTACK_H_
#define ISTACK_H_
#define SIZE 10
typedef struct iStack {
int elements[SIZE];
int top;
int id;
}iStack;
void init(iStack *stack, int id);
void push(iStack *stack, int element);
int pop(iStack *stack);
int top(iStack *stack);
int isEmpty(iStack *stack);
int isFull(iStack *stack);
int size(iStack *stack);
int capacity(iStack *stack);
void show(iStack *stack);
void init(iStack *stack, int id) {
stack->top = -1;
stack->id = id;
}
void push(iStack *stack, int element) {
if (!isFull(stack)) {
stack->top++;
stack->elements[stack->top]=element;
} else
printf("Push not allowed: stack is full.\n");
}
int pop(iStack *stack) {
if (!isEmpty(stack)) {
stack->top--;
return stack->elements[stack->top+1];
} else {
printf("Pop not allowed: stack is empty.\n");
return -1;
}
}
int top(iStack *stack) {
return isEmpty(stack)?-1:stack->elements[stack->top];
}
int isEmpty(iStack *stack) {
return stack->top==-1;
}
int isFull(iStack *stack) {
return stack->top==SIZE-1;
}
int size(iStack *stack) {
return stack->top+1;
}
int capacity(iStack *stack) {
return SIZE;
}
void show(iStack *stack) {
while (!isEmpty(stack)) {
printf("%d\n", pop(stack));
}
}
#endif
Arquivo principal Main
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "iStack.h"
int hanoi(int qtd, iStack *origem, iStack *aux, iStack *destino);
int main(){
iStack pilha1, pilha2, pilha3;
int qtd, aux, i=0;
init(&pilha1, 1);
init(&pilha2, 2);
init(&pilha3, 3);
printf("TORRE DE HANOI\n");
printf("Digite o numero de discos: ");
scanf("%d", &qtd);
aux = qtd;
while(aux > 0){
push(&pilha1, aux);
aux --;
}
hanoi(qtd, &pilha1, &pilha2, &pilha3);
}
int hanoi(int qtd, iStack *origem, iStack *aux, iStack *destino){
int topoOrigem;
if(qtd==1){
topoOrigem = pop(origem);
push(destino, topoOrigem);
printf("\n%d para %d", origem->id, destino->id);
} else {
hanoi(qtd-1, origem, destino, aux);
hanoi(1, origem, aux, destino);
hanoi(qtd-1, aux, origem, destino);
}
}
/*
//OUTRO MÉTODO:
void mover(int num, iStack *origem, iStack *destino, iStack *aux) {
push(destino,pop(origem));
if (num == 1) {
printf("\nDisco %d: %d -> %d", num, origem->id, destino->id);
} else {
mover(num-1,origem, aux, destino);
printf("\nDisco %d: %d -> %d", num, origem->id, destino->id);
mover(num-1, aux, destino, origem);
}
}
int main() {
int discos, i, aux;
iStack torres[3];
init(&torres[0],1);
init(&torres[1],2);
init(&torres[2],3);
printf("Digite o numero de discos: ");
scanf("%d", &discos);
aux = discos;
for(i=0; i<aux; i++){
push(&torres[0], discos);
discos--;
}
mover(size(&torres[0]), &torres[0], &torres[2], &torres[1]);
}*/