Pilhas C/C++ - Analisador de expressões simples
Publicado por Diego Furtado (última atualização em 23/09/2009)
[ Hits: 20.869 ]
Algoritmo em pilhas que verifica se parênteses, colchetes e chaves foram fechados corretamente.
/// AUTOR : Diego Furtado de Souza
/// EMAIL : dsouza.bh@gmail.com
/// Espaço VOL : http://www.vivaolinux.com.br/~diegofsouza
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 100
typedef char TipoChave;
typedef struct CelulaStr *Apontador;
typedef struct {
TipoChave Chave; //Valores a serem armazenados na pilha.
} TipoItem;
typedef struct CelulaStr {
TipoItem Item;
Apontador Proximo;
} Celula;
typedef struct {
Apontador Fundo, Topo;
}TipoPilha;
/***********Prototipos da Pilha**************/
void Empilha (TipoItem , TipoPilha *);
void Desempilha (TipoItem *, TipoPilha *);
void FpVazia (TipoPilha *);
bool Vazia (TipoPilha);
int main () {
TipoItem item;
TipoPilha pilha;
int i = 0;
bool check;
char expressao[max], tipo, verifica;
printf("Digite a expressao matematica : ");
gets(expressao);
FpVazia(&pilha);
while (expressao[i] != '{FONTE}') { //Enquanto não encontrar o final da string
if (expressao[i] == '(' || expressao[i] == '{' || expressao[i] == '[') {
item.Chave = expressao[i]; //Empilhando somente parenteses, chaves e colchetes.
Empilha(item, &pilha);
}
else if (expressao[i] == ')' || expressao[i] == '}' || expressao[i] == ']') {
Desempilha(&item, &pilha); //Desempilhando e testando se está fechado corretamente.
switch (item.Chave) {
case '(' :
if (expressao[i] == ')')
check = true;
else {
check = false;
tipo = expressao[i];
verifica = item.Chave;
}
break;
case '{' :
if (expressao[i] == '}')
check = true;
else {
check = false;
tipo = expressao[i];
verifica = item.Chave;
}
break;
case '[' :
if (expressao[i] == ']')
check = true;
else {
check = false;
tipo = expressao[i];
verifica = item.Chave;
}
break;
default :
check = false; //Se for digitado ') } ]' e não tiver sido aberto antes
}
}
i++;
}
if (!check)
printf("Expressao Incorreta! Esperado '%c', Digitado '%c'\n", verifica, tipo);
else if (expressao[i-1] == '(' || expressao[i-1] == '{' || expressao[i-1] == '[')
printf("Expressao Incorreta!\n");
else
printf("Expressao Correta!\n");
return 0;
}
/***********Funções da Pilha**************/
void FpVazia (TipoPilha *Pilha) {
Pilha->Topo = (Apontador) malloc(sizeof(Celula));
Pilha->Fundo = Pilha->Topo;
Pilha->Topo->Proximo = NULL;
}
void Empilha (TipoItem x, TipoPilha *Pilha) {
Apontador Aux;
Aux = (Apontador) malloc (sizeof (Celula));
Pilha->Topo->Item = x;
Aux->Proximo = Pilha->Topo;
Pilha->Topo = Aux;
}
bool Vazia (TipoPilha Pilha) {
return (Pilha.Topo == Pilha.Fundo);
}
void Desempilha(TipoItem *Item, TipoPilha *Pilha) {
Apontador Aux;
if (Vazia(*Pilha)) {
// printf("Pilha Vazia!\n");
return;
}
else {
Aux = Pilha->Topo;
Pilha->Topo = Aux->Proximo;
*Item = Aux->Proximo->Item;
free(Aux);
}
}
Listando processos via /proc/PID
Jogo da Velha com IA invencivel
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Pergunta: Meu teclado não está respondendo direito como testar e cons... (0)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (0)
Secure boot, artigo interessante, nada técnico. (5)









