Foto de Felipe S.
Felipe há 3 anos
Enviada pelo
Site

Pilha dinamica em c

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.

Linguagem C Geral
1 resposta
Professor Augusto S.
Respondeu há 3 anos
Contatar Augusto Cezar
/*
* 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

Um professor já respondeu

Envie você também uma dúvida grátis
Ver resposta
Tutoria com IA
Converse com a Minerva IA e aprenda, tire dúvidas e resolva exercícios
Minerva IA
do Profes
Respostas na hora
100% no WhatsApp
Envie suas dúvidas pelo App. Baixe agora
Prefere professores para aulas particulares ou resolução de atividades?
Aulas particulares
Encontre um professor para combinar e agendar aulas particulares Buscar professor
Tarefas
Envie sua atividade, anexe os arquivos e receba ofertas dos professores Enviar tarefa