Fiz todo o código mas Preciso implementar valida_expressao para validar se a expressão digitada está correta, se as chaves e colchetes estão fechados e abertos corretamente.
#include <stdio.h>
#include <stdlib.h>
int tam;
typedef struct Node node;
struct Node
{
char c;
struct Node *prox;
};
int menu(void);
void executa_opcao(node *PILHA, node *FILA, int op);
void inicializa(node *P_F);
int vazia(node *P_F);
node *cadastra_node(char c);
void libera_memoria_lista(node *P_F);
void insere_na_pilha(node *PILHA);
void insere_na_fila(node *FILA, char c);
node *retira_da_lista(node *P_F);
void mostrar_lista(node *P_F);
void cadastra_expressao(node *Fila);
int valida_expressao(node *Fila,node *Pilha);
int main(void)
{
int opt;
node *PILHA = (node *) malloc(sizeof(node));
node *FILA = (node *) malloc(sizeof(node));
if(!PILHA || !FILA){
printf("Sem memoria disponivel!\n");
exit(1);
}
else{
inicializa(PILHA);
inicializa(FILA);
do{
opt=menu();
executa_opcao(PILHA, FILA, opt);
}while(opt);
free(PILHA);
free(FILA);
return 0;
}
}
int menu(void)
{
int opt;
printf("Menu");
printf("\n\t0. Sair");
printf("\n\t1. Zerar (Pilha e Fila)");
printf("\n\t2. Cadastrar Expressao (Fila)");
printf("\n\t3. Exibir Expressao (Fila)");
printf("\n\t4. Validar Expressao (Fila x Pilha)");
printf("\n\nDigite a opcao: ");
scanf("%d", &opt);
return opt;
}
void executa_opcao(node *PILHA, node *FILA, int op)
{
node *tmp;
switch(op){
case 0:
libera_memoria_lista(PILHA);
libera_memoria_lista(FILA);
break;
case 1:
libera_memoria_lista(PILHA);
libera_memoria_lista(FILA);
inicializa(PILHA);
inicializa(FILA);
break;
case 2:
cadastra_expressao(FILA);
break;
case 3:
mostrar_lista(FILA);
break;
case 4:
//Validar Expressao
break;
default:
printf("Comando invalido\n\n");
}
}
void inicializa(node *P_F)
{
P_F->prox = NULL;
tam=0;
}
int vazia(node *P_F)
{
if(P_F->prox == NULL)
return 1;
else
return 0;
}
node *cadastra_node(char c)
{
node *novo = (node *) malloc(sizeof(node));
if(!novo){
printf("Sem memoria disponivel!\n");
exit(1);
}else{
novo->c = c;
novo->prox = NULL;
return novo;
}
}
void libera_memoria_lista(node *P_F)
{
if(!vazia(P_F)){
node *proxNode, *atual;
atual = P_F->prox;
while(atual != NULL){
proxNode = atual->prox;
free(atual);
atual = proxNode;
}
}
}
node *retira_da_lista(node *P_F)
{
if(P_F == NULL){
printf("Lista ja esta vazia\n");
return NULL;
}else{
node *tmp = P_F->prox;
P_F->prox = tmp->prox;
tam--;
return tmp;
}
}
void insere_na_pilha(node *PILHA,char c)
{
node *novo= cadastra_node(c);
if(vazia(PILHA))
PILHA->prox=novo;
else{
novo->prox = PILHA->prox;
PILHA->prox = novo;
}
tam++;
}
void insere_na_fila(node *FILA, char c)
{
node *novo = cadastra_node(c);
if(vazia(FILA))
FILA->prox=novo;
else{
node *tmp = FILA->prox;
while (tmp->prox != NULL)
tmp = tmp->prox;
tmp->prox = novo;
}
tam++;
}
void mostrar_lista(node *P_F)
{
if(vazia(P_F)){
printf("Lista vazia!\n\n");
return ;
}
node *tmp;
tmp = P_F->prox;
printf("LISTA :");
while( tmp != NULL){
printf("\t%c", tmp->c);
tmp = tmp->prox;
}
printf("\n");
int count;
for(count=0 ; count < tam ; count++)
printf("\t^");
printf("\nOrdem :");
for(count=0 ; count < tam ; count++)
printf("\t%d", count+1);
printf("\n\n");
}
void cadastra_expressao(node *FILA)
{
int sair = 1;
char c;
printf("Digite a expressao: ");
while (sair) {
scanf(" %c", &c);
if (c == '0') {
sair = 0;
}
else {
if ((c == '{') || (c == '}') || (c == '[') || (c == ']')) {
insere_na_fila(FILA, c);
} else {
printf("Operador invalido !");
}
}
}
}