Pilas de caracteres en C

Iniciado por Boris Morales, 19 Septiembre 2021, 15:58 PM

0 Miembros y 1 Visitante están viendo este tema.

Boris Morales

Hola buen día a todos, espero me puedan orientar o ayudar con lo siguiente:

Me gustaría saber como puedo implementar el siguiente código:


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<locale.h>

#define MAX 50

struct nodo {
    char simbolo;
    struct nodo *sig;
};

struct nodo *raiz=NULL;

void insertar(char x)
{
    struct nodo *nuevo;
    nuevo = malloc(sizeof(struct nodo));
    nuevo->simbolo = x;
    if (raiz == NULL)
    {
        raiz = nuevo;
        nuevo->sig = NULL;
    }
    else
    {
        nuevo->sig = raiz;
        raiz = nuevo;
    }
}


char extraer()
{
    if (raiz != NULL)
    {
        char informacion= raiz->simbolo;
        struct nodo *bor = raiz;
        raiz = raiz->sig;
        free(bor);
        return informacion;
    }
    else
    {
        return -1;
    }
}

void liberar()
{
    struct nodo *reco = raiz;
    struct nodo *bor;
    while (reco != NULL)
    {
        bor = reco;
        reco = reco->sig;
        free(bor);
    }
}

int vacia()
{
    if (raiz == NULL)
        return 1;
    else
        return 0;
}

void cargarCadena(char *cadena)
{
    printf("Ingrese la cadena: ");
    gets(cadena);
}

int verificarCaracteres(char *cadena)
{
    int i, j=0;
    char tmpCad[MAX];
   
    for (i=0;i<strlen(cadena);i++)
    {
        if (cadena[i]=='.')
        {
            exit( 0 );
    return 0;
        }
        else
        {
            if (cadena[i]=='!')
            {
                tmpCad[j] = cadena[i];
               
                tmpCad[j] = '\0';

puts(tmpCad);
return 0;
               
            }
            //
        }
        //j++;
    }
    if (vacia())
    {
        return 1;
    }
    else
    {
        return 0;
    }
}


int main()
{

setlocale(LC_ALL, "spanish");

    char cadena[MAX];
    char tmpCad[MAX];
   
    cargarCadena(cadena);
    if (verificarCaracteres(cadena))
    {
        printf("Proceso finalizado con éxito");
    }
    else
    {
        printf("La cadena esta vacia");
       

    }
    liberar();
    getch();
    return 0;
}


Se supone debe cumplir lo siguiente:
Citar
Si el carácter es '@', eliminar la última palabra. Por ejemplo, si se tiene la cadena "cadena de caracteres yu378", la última palabra es "yu378".
Si el carácter es ',', se elimina el último carácter.
Si el carácter es '!' se eliminan todos los caracteres que se hayan introducido.
Si el carácter es '.' se termina el programa.
Por cada operación realizada se deben mostrar los caracteres que queden

En la función VerificarCaracteres se supone ya hace lo de:
Citar
Si el carácter es '!' se eliminan todos los caracteres que se hayan introducido.
Si el carácter es '.' se termina el programa.
Pero no se si lo este aplicando bien, aunque el programa no me arroja advertencias o errores.

Y si me pudieran ayudar u orientar con lo demás se los agradecería bastante...

MAFUS

#1
CitarPor cada operación se deben mostrar los caracteres que queden.
Según entiendo se debe mostrar la cadena procesada hasta ese momento. Pero cuando encuentras el '.' cierras el programa directamente.
Para el '!' escribes un '\0' (que te machaca el carácter que has escrito anteriormente), muestras tmpCad (recuerda que solo tiene '\0') y regresas de la función sin mirar los demás caracteres.


Además tienes toda una pila que no usas para nada. ¿Estás seguro que debes usar el array tmpCad para el ejercicio?

Boris Morales

Hola MAFUS

Pues en teoría se supone que el tmpCad me ayuda a vaciar la cadena principal, dandole valores de '0' para vaciarla según la condición.

Y también quiero ver como poder sustituir la que no se usa con la princpial

MAFUS

Usa el stack.
Por ejemplo con la cadena 'mi caso,a.' tiene que ocurrir esto:
'm': la introduzco al stack. stack: 'm'
'i': la introduzco al stack. stack: 'mi'
' ': la introduzco al stack. stack: 'mi '
'c': la introduzco al stack. stack: 'mi c'
'a': la introduzco al stack. stack: 'mi ca'
's': la introduzco al stack. stack: 'mi cas'
'o': la introduzco al stack. stack: 'mi caso'
',': borro el ultimo elemento del stack. stack: 'mi cas'
'a': la introduzco al stack.  stack: 'mi casa'
'.': dejo de procesar la cadena. stack: 'mi casa'

Por tanto debes hacer uso del stack que te han proporcionado para realizar el trabajo.
Además deberás inventar algo para poder imprimir la cadena que hay guardada en la stack en orden y sin vaciarla.

Espero que así explicado veas que no hay que usar ese array auxiliar. Si sabes usar un stack (el ejercicio está pensado para eso) no te será difícil.