aula 232

Como inverter a ordem das letras de uma string?

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);
}

Deixe um comentário

15 + 5 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.