Advertisement
Guest User

Uso de pilha dinamica para identifica pareamento de parenteses e colchetes

a guest
Nov 30th, 2021
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.94 KB | None | 0 0
  1. /*
  2. * Utilizando a estrutura de pilhas dinâmica, resolva o problema de decidir se
  3. * uma dada sequência de parênteses e colchetes está bem-formada (ou seja,
  4. * parênteses e colchetes são fechados na ordem inversa àquela em que foram
  5. * abertos). Por exemplo, a sequência ( ( ) [ ( ) ] ) está bem formada, enquanto
  6. * que a sequência ( [ ) ] está malformada.
  7. */
  8.  
  9. /*
  10. * =====RESPOSTA=====
  11. * Uma possivel solucao esta na seguinte estrategia:
  12. * 1- A cada ( ou [ lido, empilha este caractere
  13. * 2- A cada ) ou ] lido, desempilha um caractere
  14. *  2.1- Se o caractere desempilhado for o tipo correto de simbolo de fechar, continue analisando
  15. *  2.2- Se for o tipo incorreto encerre a analise, pois a expressao esta mal formada
  16. * 3- Ao final, verifique se a pilha ficou vazia
  17. *  3.1 Se estiver vazia, a analise foi um sucesso: expressao bem formada
  18. *  3.2 Se ainda há elementos na pilha, faltou fechar algum colchete ou parentese, logo expressao mal formada
  19. * FIM
  20. */
  21.  
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25.  
  26. // Estrutura da pilha
  27. typedef struct no_pilha
  28. {
  29.     char dado;
  30.     struct no_pilha *anterior;
  31. } no;
  32.  
  33. typedef struct pilha
  34. {
  35.     no *topo;
  36.     int tamanho;
  37.  
  38. } tpilha;
  39.  
  40. // Cria pilha
  41. tpilha *cria_pilha()
  42. {
  43.     tpilha *p = (tpilha *)malloc(sizeof(tpilha));
  44.     p->topo = NULL;
  45.     p->tamanho = 0;
  46.  
  47.     return p;
  48. }
  49.  
  50. // Insere elemento no topo da pilha
  51. void push(tpilha *p, char elemento)
  52. {
  53.     no *aux = (no *)malloc(sizeof(no));
  54.  
  55.     aux->dado = elemento;
  56.     aux->anterior = p->topo;
  57.  
  58.     p->tamanho++;
  59.     p->topo = aux;
  60. }
  61.  
  62. // Testa se a pilha está vazia
  63. int vazia(tpilha *p)
  64. {
  65.     if (p->tamanho == 0)
  66.         return 1;
  67.     else
  68.         return 0;
  69. }
  70.  
  71. // Remove elemento do topo da pilha
  72. char pop(tpilha *p)
  73. {
  74.     char dado = 'a'; // Caractere qualquer, a ser retornado caso a pilha esteja vazia
  75.     if (!vazia(p))
  76.     {
  77.         no *aux = p->topo;
  78.         dado = aux->dado;
  79.  
  80.         p->topo = aux->anterior;
  81.         p->tamanho--;
  82.  
  83.         free(aux);
  84.     }
  85.     return dado;
  86. }
  87.  
  88. void libera_pilha(tpilha *p)
  89. {
  90.     while (!vazia(p))
  91.     {
  92.         pop(p);
  93.     }
  94.     free(p);
  95. }
  96.  
  97. char testar_bem_formada(char *sequencia)
  98. {
  99.     tpilha *p = cria_pilha();
  100.     char aux;
  101.  
  102.     for (int i = 0; i < strlen(sequencia); i++)
  103.     {
  104.         if (sequencia[i] == '(' || sequencia[i] == '[')
  105.             push(p, sequencia[i]);
  106.         else if (sequencia[i] == ')' || sequencia[i] == ']')
  107.         {
  108.             aux = pop(p);
  109.  
  110.             if (aux == '(' && sequencia[i] != ')')
  111.             {
  112.                 libera_pilha(p);
  113.                 return 'n';
  114.             }
  115.             else if (aux == '[' && sequencia[i] != ']')
  116.             {
  117.                 libera_pilha(p);
  118.                 return 'n';
  119.             }
  120.         }
  121.     }
  122.     if (vazia(p))
  123.     {
  124.         libera_pilha(p);
  125.         return 's';
  126.     }
  127.  
  128.     libera_pilha(p);
  129.     return 'n';
  130. }
  131.  
  132. int main()
  133. {
  134.     char sequencia[64];
  135.     char bem_formada;
  136.  
  137.     printf("Digite uma sequencia de colchetes e parenteses:\n> ");
  138.     scanf(" %s", sequencia);
  139.  
  140.     bem_formada = testar_bem_formada(sequencia);
  141.  
  142.     if (bem_formada == 's')
  143.         printf("A sequencia esta bem formada\n\n");
  144.     else
  145.         printf("A sequencia esta mal formada\n\n");
  146.  
  147.     return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement