Pesquisar neste blog

20/01/2018

Torre de Hanoi em C/C++

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