Pilhas C/C++ - Analisador de expressões simples
Publicado por Diego Furtado (última atualização em 23/09/2009)
[ Hits: 20.956 ]
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);
}
}
Exemplo de sistema especialista usando Inteligência Artificial
Cálculo de logaritmo de um número por Série de Taylor em C
Nenhum comentário foi encontrado.
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Gentoo binário em 2026: UEFI, LUKS, Btrfs e Systemd
Trabalhando Nativamente com Logs no Linux
Jogando Daikatana (Steam) com Patch 1.3 via Luxtorpeda no Linux
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
Vou destruir sua infância:) (6)
Quando vocês pararam de testar distros? (24)
O que houve com slackware ??? (12)









