Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda Balanceamento de expressão com colchetes e chaves em C


Tilipim

Pergunta

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 !");
                  }
        }
    }
}
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...