Dando continuidade ao nosso Curso de Programação C, vamos aprender nesta aula como inverter a ordem das letras de uma string preservando a ordem das palavras.
A título de exemplo, imagine a seguinte frase: ABRA A PORTA MARIQUINHA
A saída deve ser: ARBA A ATROP AHNIUQIRAM
Cada palavra aparece na mesma ordem, porém com suas letras invertidas.
Este exercício pode ser facilmente resolvido com uma estrutura de dados do tipo pilha. Enquanto não encontrarmos um espaço, vamos empilhar cada letra da palavra. Ao fazer isso perceba que a última letra da palavra ficará no topo da pilha. Quando um espaço for encontrado, basta desempilhar todas as letras empilhadas e teremos a palavra invertida.
O trecho de código a seguir realiza esse processo:
while(x[i] != '\0'){ // enquanto não for o fim da string if(x[i] != ' ') // se não for um espaço, então empilha o caracter pilha = empilhar(pilha, x[i]); else { // se for um espaço, desempilha toda a palavra empilhada while(pilha){ remover = desempilhar(&pilha); printf("%c", remover->caracter); free(remover); } printf(" "); } i++; }
Contudo, perceba que quando o fim da string for atingido, a repetição irá finalizar e a última palavra ficará empilhada. Então, precisamos repetir o processo para desempilhar a última palavra, assim:
while(x[i] != '\0'){ // enquanto não for o fim da string if(x[i] != ' ') // se não for um espaço, então empilha o caracter pilha = empilhar(pilha, x[i]); else { // se for um espaço, desempilha toda a palavra empilhada while(pilha){ remover = desempilhar(&pilha); printf("%c", remover->caracter); free(remover); } printf(" "); } i++; } while(pilha){ // desempilha a última palavra remover = desempilhar(&pilha); printf("%c", remover->caracter); free(remover); }
Código completo em C para inverter a ordem das letras das palavras de uma string
/* Código escrito por Wagner Gaspar Julho de 2021 3) Escreva um algoritmo para inverter a ordem das letras de cada palavra de uma string, preservando a ordem das palavras. Por exemplo, dado o texto: ABRA A PORTA MARIQUINHA A saída deve ser: ARBA A ATROP AHNIUQIRAM */ typedef struct no{ char caracter; struct no *proximo; }No; No* empilhar(No *pilha, char valor){ No *novo = malloc(sizeof(No)); if(novo){ novo->caracter = valor; novo->proximo = pilha; return novo; } else printf("\tErro ao alocar memoria!\n"); return NULL; } No* desempilhar(No **pilha){ No *remover = NULL; if(*pilha){ remover = *pilha; *pilha = remover->proximo; } else printf("\tPilha vazia\n"); return remover; } void inverter_palavras(char x[]){ int i = 0; No *remover, *pilha = NULL; while(x[i] != '\0'){ if(x[i] != ' ') pilha = empilhar(pilha, x[i]); else { while(pilha){ remover = desempilhar(&pilha); printf("%c", remover->caracter); free(remover); } printf(" "); } i++; } while(pilha){ remover = desempilhar(&pilha); printf("%c", remover->caracter); free(remover); } printf("\n"); } int main(){ char texto[50] = {"EU NAO ABRO NAO!"}; inverter_palavras(texto); }