// moverTopo: move o bloco A para o topo // onde o bloco B esta, remove todos // os blocos sobre o bloco A, retornando-os // as posições iniciais void moverTopo(int a, int b, int retornoA, int retornoB, tPilha *p){ int valorA, valorB, valorAux; if(acessaTopo(&valorA, (p + retornoA)) && valorA == a){ desempilhar(&valorA, (p + retornoA)); empilhar(valorA, (p + retornoB)); }else{ //verifica o valor do topo do bloco A while(acessaTopo(&valorA, &p[retornoA]) && valorA != a){ desempilhar(&valorAux, &p[retornoA]); empilhar(valorAux, (p + valorAux)); } desempilhar(&valorA, (p + retornoA)); empilhar(valorA, (p + retornoB)); } printf("\n\t\tMOVER %d TOPO %d", a, b); }
// moverAcima: move o bloco A para o // acima do bloco B, retornando à // posição inicial os demais blocos sobre // o bloco B void moverAcima(int a, int b, int retornoA, int retornoB, tPilha p[]){ int valorA, valorB, valorAux; if(acessaTopo(&valorA, (p + retornoA)) && valorA == a){ desempilhar(&valorA, (p + retornoA)); //verifica o topo do bloco B if(acessaTopo(&valorB, (p + retornoB)) && valorB == b){ empilhar(valorA, (p + retornoB)); }else{ while(acessaTopo(&valorB, (p + retornoB)) && valorB != b){ desempilhar(&valorAux, (p + retornoB)); empilhar(valorAux, (p + valorAux)); } empilhar(valorA, (p + retornoB)); } }else{ while(acessaTopo(&valorA, (p + retornoA)) && valorA != a){ desempilhar(&valorAux, (p + retornoA)); empilhar(valorAux, (p + valorAux)); } desempilhar(&valorA, &p[retornoA]); //verifica o topo do bloco B if(acessaTopo(&valorB, (p + retornoB)) && valorB == b){ empilhar(valorA, (p + retornoB)); }else{ while(acessaTopo(&valorB, (p + retornoB)) && valorB != a){ desempilhar(&valorAux, (p + retornoB)); empilhar(valorAux, (p + valorAux)); } empilhar(valorA, (p + retornoB)); } } printf("\n\t\tMOVER %d ACIMA %d",a, b); }
int mover(Pilha * origem, Pilha * destino){ if(tamanho(origem) > 0 && (tamanho(destino) <= 0 || topo(origem) < topo(destino))){ empilhar(destino,desempilhar(origem)); return 1; } else { printf("Nao e possivel fazer este movimento.\n"); return 0; } }
Pilha* empilharExpressaoOperador(Pilha* p, char* operador){ if(tamanhoPilha(p) > 1){ Arvore* primeiro, *segundo; Pilha* pilha; primeiro = getArvoreTopoPilha(p); p = desempilhar(p); segundo = getArvoreTopoPilha(p); p = desempilhar(p); Arvore* arvoreOperador = inicializaArvore(TIPO_LITERAL, operador, NULL, NULL); arvoreOperador = setFilhosEsquerdaCentroDireita(arvoreOperador, primeiro, segundo, NULL); p = empilhar(p, arvoreOperador); } return p; }
int inicializar(Pilha * pino1, int * discos){ printf("\nTorre de Hanoi, desenvolvido em C por Ryan Sampaio Filho.\n"); printf("Voce quer jogar com quantos discos?\n"); fflush(stdin); scanf("%d", discos); if(*discos < 0){ return 1; } int aux = *discos; while(aux > 0){ empilhar(pino1, aux); aux = aux - 1; } return 2; }
int main( void ) { char word[ 50 ]; printf( "Digite uma palavra : " ); scanf( "%s", word ); int i, j; printf( "Empilhando...\n" ); for( i = strlen( word )-1, j = 0; i > -1; i-=1, j++ ) empilhar( word[ i ], j ); printf( "Desempilhando...\n" ); for( i = 0; i < strlen( word ); i++ ) desempilhar(); }
// openFile: recebe com parâmetro o nome // do arquivo a ser lido, imprime o dados // do arquivo e retornar se foi possivel // abrir ou não o arquivo int openFile(char arquivo[], int escolha){ FILE *fptr; int i = 0; char cha[MAX]; char ch[MAX]; int a[MAX], b[MAX]; tPilha p[MAX]; cabecalho("LENDO ARQUIVO..."); fptr = fopen(arquivo, "r"); if(escolha){ if(fptr == NULL){ printf("\t\t# ERRO: IMPOSSIVEL ABRIR O ARQUIVO. [ENTER]"); fflush(stdin); getchar(); return 0; }else{ while(fscanf(fptr, "%s %d %d", ch, &a[i], &b[i]) != EOF){ if(!i){ // converte caracter para inteiro // pega o valor da primeira linha do arquivo int j = ch[0]-'0'; // inicializa os blocos for(int i = 0; i < j; i++){ inicializa(&p[i]); empilhar(i,&p[i]); } } filter(p, ch, a[i], b[i]); i++; } } fflush(stdin); getchar(); }else if(fptr == NULL) return 0; else while(fgets(cha,MAX, fptr) != NULL) printf("\t\t%s", cha); fclose(fptr); return 1; }
Pilha* empilharElementoCriandoArvore(Pilha* p, int tipo, void* valorNo){ Arvore* a = inicializaArvore(tipo, valorNo, NULL, NULL); p = empilhar(p, a); return p; }
int main(){ int i; PILHA_DINAMICA pilha; for (i = 0; i < 5; i++){ ITEM item; item.valor = i; if (empilhar(&pilha, &item)){ printf("Entrou na pilha: %d", item.valor); } else { printf("%d: Erro na alocação.\n", item.valor); } } printf("\nPilha atual: "); imprime(&pilha); printf("\n"); printf("Tamanho: %d\n--\n", contar(&pilha)); ITEM item1; item1.valor = 100; if (empilhar(&pilha, &item1)){ printf("Entrou na pilha: %d", item.valor); } else { printf("%d: Erro na alocação.\n", item.valor); } printf("\nPilha atual: "); imprime(&pilha); printf("\n"); printf("Tamanho: %d\n--\n", contar(&pilha)); frente(&pilha, &item1); printf("Elemento do topo: %d\n--\n, item1.valor"); if (desempilhar(&pilha, &item1)){ printf("Saiu na pilha: %d", item.valor); } else { printf("Pilha vazia.\n", item1.valor); } item1.valor = 9; if (empilhar(&pilha, &item1)){ printf("Entrou na pilha: %d", item.valor); } else { printf("%d: Erro na alocação.\n", item.valor); } printf("\nPilha atual: "); imprime(&pilha); printf("\n"); printf("Tamanho: %d\n--\n", contar(&pilha)); return 0; }