×
Ir ao conteúdo
  • Cadastre-se

GabrielVilhenaMagri

Membro Júnior
  • Posts

    1
  • Cadastrado em

  • Última visita

  • Qualificações

    0%
  1. <#include <string.h> #include <stdio.h> #define TAMANHO_MAXIMO_DE_PILHA 100 #define TAMANHO_MAXIMO_DE_FILA 100 typedef struct { char pedaco [21]; } Elemento; typedef struct { Elemento vetor_de_elementos [TAMANHO_MAXIMO_DE_PILHA]; int posicao_do_ultimo_elemento; int topo; } Pilha; typedef struct { Elemento vetor_de_Elementos [TAMANHO_MAXIMO_DE_FILA]; int posicao_do_ultimo_Elemento; } Fila; void inicialize_a_pilha (Pilha* p) { (*p).posicao_do_ultimo_elemento=-1; } unsigned char /*boolean*/ pilha_vazia (Pilha p) { if (p.posicao_do_ultimo_elemento==-1) { printf("Infelizmente sua pilha esta vazia"); return 1/*true*/; } else { printf("felizmente sua pilha não esta vazia"); return 0/*false*/; } } unsigned char /*boolean*/ pilha_cheia (Pilha p) { if (p.posicao_do_ultimo_elemento==TAMANHO_MAXIMO_DE_PILHA-1) return 1/*true*/; else return 0/*false*/; } void guarde_item_na_pilha (Pilha* p, Elemento e) { (*p).posicao_do_ultimo_elemento++; (*p).vetor_de_elementos[(*p).posicao_do_ultimo_elemento] = e; } Elemento recupere_um_item_da_pilha (Pilha p ){ return p.vetor_de_elementos[p.posicao_do_ultimo_elemento]; } void remova_um_item_da_pilha (Pilha* p) { (*p).posicao_do_ultimo_elemento--; } void inicialize_a_fila (Fila* f) { (*f).posicao_do_ultimo_Elemento=-1; } unsigned char fila_vazia (Fila f) { if (f.posicao_do_ultimo_Elemento==-1) { printf("Infelizmente sua pilha esta vazia"); return 1/*true*/; } else { printf("felizmente sua fila não esta vazia"); return 0/*false*/; } } unsigned char fila_cheia (Fila f) { if (f.posicao_do_ultimo_Elemento==TAMANHO_MAXIMO_DE_FILA-1) return 1/*true*/; else return 0/*false*/; } void guarde_item_na_fila (Fila* f, Elemento e) { (*f).posicao_do_ultimo_Elemento++; (*f).vetor_de_Elementos[(*f).posicao_do_ultimo_Elemento] = e; } Elemento recupere_um_item_da_fila (Fila f) { return f.vetor_de_Elementos[f.posicao_do_ultimo_Elemento]; } void remova_um_item_da_fila (Fila* f) { int i; for (i=1; i<=(*f).posicao_do_ultimo_Elemento; i++) (*f).vetor_de_Elementos [i-1]=(*f).vetor_de_Elementos [i]; (*f).posicao_do_ultimo_Elemento--; } unsigned char so_tem_chars_validos (char expressao [201]) { unsigned int i, tamanho=strlen(expressao)-1; for (i=0; i<tamanho; i++){ if (strchr("(^*/+-) .0123456789",expressao[i])==NULL){ printf("expressão invalida!"); return 0; } } return 1/*true*/; } unsigned char posso_desempilhar (Elemento *doTopoDaPilha, char daSequencia) { int i,j; int linha, coluna; char char_validos [7] = "(^/+-)"; unsigned char tabela [7][7] = {{0,0,0,0,0,0,1}, {0,0,1,1,1,1,1}, {0,0,1,1,1,1,1}, {0,0,1,1,1,1,1}, {0,0,0,0,1,1,1}, {0,0,0,0,1,1,1}, {0,0,0,0,0,0,0}}; for(i=0;i<7;i++){ if(char_validos[i] == doTopoDaPilha){ linha = i; } } for(j=0;j<7;j++){ if(char_validos[j] == daSequencia){ coluna = j; } } return tabela[linha][coluna]; } unsigned char parenteses_balanceados (char expressao [201]) { unsigned int i, tamanho=strlen(expressao)-1, qtd_parenteses_abertos=0; for (i=0; i<tamanho; i++) if (expressao[i]=='(') qtd_parenteses_abertos++; else if (expressao[i]==')') if (qtd_parenteses_abertos==0){ printf("expressão invalida! "); return 0/*false*/; } else{ qtd_parenteses_abertos--; } if (qtd_parenteses_abertos!=0){ printf("expressão invalida! "); return 0/*false*/; } else{ return 1/*true*/; } } void elimine_espacos (char expressao [], int pos) { char* string_comecando_no_1o_espaco=strchr(expressao,' '); while (pos!=-1) { memmove(string_comecando_no_1o_espaco,string_comecando_no_1o_espaco+1,strlen(string_comecando_no_1o_espaco+1)); string_comecando_no_1o_espaco=strchr(expressao,' '); } } void obtem_pedaco (char expressao[], char pedaco[], int* pos) { int i=0; // 1,2 if (expressao[*pos]>='0' && expressao[*pos]<='9') { while (expressao[*pos]>='0' && expressao[*pos]<='9') { pedaco[i]=expressao[*pos]; i++; (*pos)++; } pedaco[i]='\0'; } else { pedaco[i]=expressao[*pos]; i++; (*pos)++; pedaco[i]='\0'; } } int main () { char item_fila; char item_fila_numero; Elemento elem; Pilha operadoresPilha; Fila expressaoFila,numerosFila,saidaFila; int i,n,x,y,g; char expressao [201] = ""; char pedaco [21]; // "20" int pos=0; // 1,2,3,4,5 int verificacao = 0; int verificacaoParenteses = 0; int tamanhoNumerosFila; int tamanhoPilha; int verificaPilha; char possodesempilhar; Elemento ultimoElemento; int tamanhoFilaNumero; int tamanhoPilhaOperador; int tamanhoFilaSaida; char parenteses_fechados[1] = ")"; char parenteses_abertos[1] = "(" ; inicialize_a_fila(&expressaoFila); inicialize_a_fila(&numerosFila); inicialize_a_fila(&saidaFila); inicialize_a_pilha(&operadoresPilha); while(verificacao == 0 || verificacaoParenteses == 0) { printf(" Digite a sua expressão: "); fgets(expressao,200,stdin); verificacao = so_tem_chars_validos(expressao); verificacaoParenteses = parenteses_balanceados(expressao); } int tamanho = strlen(expressao); for(i=0;i<=tamanho+2;i++) { obtem_pedaco (expressao,pedaco,&i); strcpy(elem.pedaco,pedaco); if (pedaco>='0' && pedaco<='9' || pedaco == '.') { if( i == tamanho-1) { guarde_item_na_fila(&saidaFila,elem); } else { guarde_item_na_fila(&numerosFila,elem); } } else{ tamanhoNumerosFila = numerosFila.vetor_de_Elementos; for(x=0;x<tamanhoNumerosFila;x++){ if (pedaco>='0' && pedaco<='9' || pedaco == '.'){ guarde_item_na_fila(&saidaFila,elem); remova_um_item_da_fila(&numerosFila); } } } verificaPilha = operadoresPilha.vetor_de_elementos; if(pedaco == parenteses_fechados[0]){ while(g==1){ if(verificaPilha != parenteses_abertos[0]){ guarde_item_na_fila(&saidaFila, elem); remova_um_item_da_pilha(&operadoresPilha); } else{ remova_um_item_da_pilha(&operadoresPilha); g = 0; } } } else{ tamanhoPilha = operadoresPilha.vetor_de_elementos; if(tamanhoPilha == 0){ guarde_item_na_pilha(&operadoresPilha,elem); } else{ while(tamanhoPilha > 0){ ultimoElemento = recupere_um_item_da_pilha (operadoresPilha); possodesempilhar = posso_desempilhar(&ultimoElemento,pedaco); if(possodesempilhar == 1 && tamanhoPilha > 0){ remova_um_item_da_pilha(&operadoresPilha); guarde_item_na_fila(&saidaFila,elem); tamanhoPilha = tamanhoPilha - 1; } else if(possodesempilhar == 1 && tamanhoPilha == 0){ guarde_item_na_pilha(&operadoresPilha,elem); tamanhoPilha = tamanhoPilha - 1; } else{ guarde_item_na_pilha(&operadoresPilha,elem); tamanhoPilha = tamanhoPilha - 1; } } } } } tamanhoFilaNumero = numerosFila.vetor_de_Elementos; if( tamanhoFilaNumero > 0 ){ for(i=0;i<tamanhoFilaNumero;i++){ guarde_item_na_fila(&saidaFila, elem); remova_um_item_da_fila(&numerosFila); } } tamanhoPilhaOperador = operadoresPilha.vetor_de_elementos; if( tamanhoPilhaOperador > 0){ for(i=0;i<tamanhoPilhaOperador;i++){ guarde_item_na_fila(&saidaFila, elem); remova_um_item_da_pilha(&operadoresPilha); } } tamanhoFilaSaida = saidaFila.vetor_de_Elementos; for(i=0;i<tamanhoFilaSaida;i++){ printf("%c",recupere_um_item_da_fila(saidaFila)); } return 0; }>

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!