Miquel_Fuster

Tratado de cadena con una pila.

Sep 19th, 2021 (edited)
1,360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.22 KB | None | 0 0
  1. /*  Controla un stream de texto, en este caso una cadena de texto mediante caracteres de control.
  2.     Caracteres de control:
  3.     @ -> Elimina la última palabra
  4.     , -> Elimina el último carácter
  5.     ! -> Elimina todos los caracteres introducidos
  6.     . -> Termina el programa
  7.  */
  8.  
  9.  
  10.  
  11. #include<stdio.h>
  12. #include<stdlib.h>
  13. #include<string.h>
  14.  
  15. #define MAX 50
  16.  
  17. struct nodo {
  18.     char simbolo;
  19.     struct nodo *sig;
  20. } *raiz = NULL;
  21.  
  22. void insertar(char x) {
  23.     struct nodo *nuevo;
  24.    
  25.     nuevo = malloc(sizeof(struct nodo));
  26.     nuevo->simbolo = x;
  27.     nuevo->sig = raiz;
  28.     raiz = nuevo;
  29. }
  30.  
  31. char extraer() {
  32.     char informacion = -1;
  33.     struct nodo *bor = raiz;
  34.    
  35.     if (raiz) {
  36.         informacion = raiz->simbolo;
  37.         raiz = raiz->sig;
  38.         free(bor);  
  39.     }
  40.    
  41.     return informacion;
  42. }
  43.  
  44. void liberar() {
  45.     struct nodo *bor;
  46.  
  47.     while(raiz) {
  48.         bor = raiz;
  49.         raiz = raiz->sig;
  50.         free(bor);
  51.     }
  52. }
  53.  
  54. int vacia() {
  55.     return raiz? 0 : 1;
  56. }
  57.  
  58. void cargarCadena(char *cadena) {
  59.     printf("Ingrese la cadena: ");
  60.     fgets(cadena, MAX, stdin);
  61. }
  62.  
  63. void imprimir_cadena_pila_auxiliar(struct nodo *n) {
  64.     if(n) {
  65.         imprimir_cadena_pila_auxiliar(n->sig);
  66.         putchar(n->simbolo);
  67.     }
  68. }
  69.  
  70. void imprimir_cadena_pila() {
  71.     imprimir_cadena_pila_auxiliar(raiz);
  72. }
  73.  
  74. int verificarCaracteres(char *cadena) {
  75.     for (size_t i=0, iterar=1; iterar && i<strlen(cadena); i++) {
  76.         switch(cadena[i]) {
  77.         case '@': // elimina la ultima palabra
  78.             ;
  79.             char c = extraer();
  80.             while(c != ' ' && c != -1)
  81.                 c = extraer();
  82.             if(c == ' ')
  83.                 insertar(' ');
  84.             break;
  85.         case ',': // elimina el ultimo caracter
  86.             if(!vacia())
  87.                 extraer();
  88.             break;
  89.         case '!': // elimina todos los caracteres introducidos
  90.             liberar();
  91.             break;
  92.         case '.': // termina el programa
  93.             iterar = 0;
  94.             break;
  95.         default: // introducir el caracter en la pila
  96.             insertar(cadena[i]);
  97.         }
  98.         imprimir_cadena_pila();
  99.         puts("");
  100.     }
  101.    
  102.     return !vacia();
  103. }
  104.  
  105.  
  106. int main() {
  107.     char cadena[MAX];
  108.    
  109.     cargarCadena(cadena);
  110.     if (verificarCaracteres(cadena)) {
  111.         printf("Proceso finalizado con éxito");
  112.     } else {
  113.         printf("La cadena esta vacia");
  114.     }
  115.     liberar();
  116. }
Add Comment
Please, Sign In to add comment