Pilha dinamica em c

C Estrutura de dados

Utilizando a estrutura de pilhas dinâmica, resolva o problema de decidir se uma dada sequência de parênteses e colchetes está bem-formada (ou seja, parênteses e colchetes são fechados na ordem inversa àquela em que foram abertos). Por exemplo, a sequência ( ( ) [ ( ) ] ) está bem formada, enquanto que a sequência ( [ ) ] está malformada.

Foto de Felipe S.
Felipe perguntou há 2 anos

Sabe a resposta?

Ganhe 10 pts por resposta de qualidade
Responder dúvida
1 resposta
1
votos
1 usuário votou nessa resposta como útil.
Professor Augusto S.
Identidade verificada
  • CPF verificado
  • E-mail verificado
Respondeu há 2 anos
Melhor resposta
Essa foi a melhor resposta, escolhida pelo autor da dúvida
/*
* Utilizando a estrutura de pilhas dinâmica, resolva o problema de decidir se
* uma dada sequência de parênteses e colchetes está bem-formada (ou seja,
* parênteses e colchetes são fechados na ordem inversa àquela em que foram
* abertos). Por exemplo, a sequência ( ( ) [ ( ) ] ) está bem formada, enquanto
* que a sequência ( [ ) ] está malformada.
*/

/*
* =====RESPOSTA=====
* Uma possivel solucao esta na seguinte estrategia:
* 1- A cada ( ou [ lido, empilha este caractere
* 2- A cada ) ou ] lido, desempilha um caractere
* 2.1- Se o caractere desempilhado for o tipo correto de simbolo de fechar, continue analisando
* 2.2- Se for o tipo incorreto encerre a analise, pois a expressao esta mal formada
* 3- Ao final, verifique se a pilha ficou vazia
* 3.1 Se estiver vazia, a analise foi um sucesso: expressao bem formada
* 3.2 Se ainda há elementos na pilha, faltou fechar algum colchete ou parentese, logo expressao mal formada
* FIM
*/

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

// Estrutura da pilha
typedef struct no_pilha
{
char dado;
struct no_pilha *anterior;
} no;

typedef struct pilha
{
no *topo;
int tamanho;
} tpilha;

// Cria pilha
tpilha *cria_pilha()
{
tpilha *p = (tpilha *)malloc(sizeof(tpilha));
p->topo = NULL;
p->tamanho = 0;

return p;
}

// Insere elemento no topo da pilha
void push(tpilha *p, char elemento)
{
no *aux = (no *)malloc(sizeof(no));

aux->dado = elemento;
aux->anterior = p->topo;

p->tamanho++;
p->topo = aux;
}

// Testa se a pilha está vazia
int vazia(tpilha *p)
{
if (p->tamanho == 0)
return 1;
else
return 0;
}

// Remove elemento do topo da pilha
char pop(tpilha *p)
{
char dado = 'a'; // Caractere qualquer, a ser retornado caso a pilha esteja vazia
if (!vazia(p))
{
no *aux = p->topo;
dado = aux->dado;

p->topo = aux->anterior;
p->tamanho--;

free(aux);
}
return dado;
}

void libera_pilha(tpilha *p)
{
while (!vazia(p))
{
pop(p);
}
free(p);
}

char testar_bem_formada(char *sequencia)
{
tpilha *p = cria_pilha();
char aux;

for (int i = 0; i < strlen(sequencia); i++)
{
if (sequencia[i] == '(' || sequencia[i] == '[')
push(p, sequencia[i]);
else if (sequencia[i] == ')' || sequencia[i] == ']')
{
aux = pop(p);

if (aux == '(' && sequencia[i] != ')')
{
libera_pilha(p);
return 'n';
}
else if (aux == '[' && sequencia[i] != ']')
{
libera_pilha(p);
return 'n';
}
}
}
if (vazia(p))
{
libera_pilha(p);
return 's';
}

libera_pilha(p);
return 'n';
}

int main()
{
char sequencia[64];
char bem_formada;

printf("Digite uma sequencia de colchetes e parenteses:\n> ");
scanf(" %s", sequencia);

bem_formada = testar_bem_formada(sequencia);

if (bem_formada == 's')
printf("A sequencia esta bem formada\n\n");
else
printf("A sequencia esta mal formada\n\n");

return 0;
}

Obs: Este editor de texto nao permite formatar muito bem o código, com tabs para identação. Para uma leitura mais fácil, visite:

https://pastebin.com/KjFuWm2M

ou

https://github.com/acssales/pilha_checagem_parenteses

Envie uma dúvida gratuitamente

Envie sua primeira dúvida gratuitamente aqui no Tira-dúvidas Profes. Nossos professores particulares estão aqui para te ajudar.

Professores particulares de C

+ Ver todos
Encontre professor particular para te ajudar nos estudos
R$ 50 / h
Augusto S.
Parnamirim / RN
Augusto S.
4,2 (10 avaliações)
Tarefas resolvidas 13 tarefas resolvidas
Identidade verificada
  • CPF verificado
  • E-mail verificado
1ª hora grátis
C - Laços de repetição C - recursao Programação em C Intermediário
Graduação: Ciência da Computação (UFF - Universidade Federal Fluminense)
Prof de programação e computação. Aprenda de vez a dominar o computador!
R$ 60 / h
César D.
Mogi Guaçu / SP
César D.
4,9 (812 avaliações)
Horas de aulas particulares ministradas 87 horas de aula
Tarefas resolvidas 995 tarefas resolvidas
Identidade verificada
  • CPF verificado
  • E-mail verificado
1ª hora grátis
C - matriz C - Geral Programação em C Intermediário
Graduação: Matemática Aplicada e Computacional (Universidade Estadual de Campinas (UNICAMP))
Faça aulas de matemática, computação e programação em c, c++, java e python.
R$ 75 / h
Danilo L.
Campina Grande / PB
Danilo L.
4,9 (18 avaliações)
Horas de aulas particulares ministradas 27 horas de aula
Tarefas resolvidas 1 tarefa resolvida
Identidade verificada
  • CPF verificado
  • E-mail verificado
1ª hora grátis
C - Gerenciamento de memória C - matriz C - Geral
Graduação: Engenharia da Computação (IFPB - Campus Campina Grande )
Desenvolvedor web full stack. Acompanhamento particular em excel/vba, python, c/c++, java, selenium e js!