Ir ao conteúdo
  • Cadastre-se

Jose Augusto Cenci Castilho

Membro Júnior
  • Posts

    1
  • Cadastrado em

  • Última visita

Reputação

1
  1. Boa tarde, galera! Segue abaixo o código do que consegui fazer até agora, mas não está dando certo a função "Calcule" preciso de ajuda nisso, urgente! Ele pede para fazer com fila e pilhas, então tem que ser assim mesmo, mas não tenho ideia de como prosseguir. Enunciado: #include <iostream> #include <stdlib.h> #include <string.h> using namespace std; struct Numeros{ string val_inser; Numeros *prox; }; struct FilaTurma{//Cabeçalho Numeros *Inicio; Numeros *Fim; //controlar o topo volta o tamanho da lista para mim = Tamanho vai ser igual a Topo + 1; int Tamanho;//volta o tamanho //posição do topo; //começa de baixo para cima, alterando sempre o topo! }; struct Pilhas{ //Cabeçalho Numeros *Topo; //Com o controle do topo eu consigo calcular o tamanho int Tamanho; }; void Ini_Fila(FilaTurma *T){ //Cria uma lista vazia T->Inicio = NULL; T->Fim = NULL; T->Tamanho = 0; } void Ini_Pilhas(Pilhas *T){ //Cria uma pilha vazia T->Topo = NULL; T->Tamanho = 0; } int Fila_Vazia(FilaTurma *T){ //Verifica se a lista está vazia (1 - Vazia, 0 - Tem mais de 1 elemento) int Ret; if (T->Tamanho == 0){ Ret = 1; } else{ Ret = 0; } return Ret; } Numeros* Cria_Elemento(string val_inser){ Numeros *Elemento; Elemento = new Numeros; Elemento->val_inser = val_inser; Elemento->prox = NULL; return Elemento; } void Enfileirar(FilaTurma *T, string val_inser){ Numeros *Elemento; Elemento = Cria_Elemento (val_inser); if (Elemento != NULL){ //Há espaço na pilha if (Fila_Vazia (T) == 1){ T->Inicio = Elemento; } else{ T->Fim->prox = Elemento; } T->Fim = Elemento; T->Tamanho++; } else{ cout << "Não há mais espaço na pilha pra inserção!!" << endl; } } Numeros* Desenfilerar_Aluno(FilaTurma *T){ //teria que mexer aqui, para já desenfileirar e empilhar na pilhaOperadores ou na pilhaNumeros Numeros *Prox; Numeros *Retorno; if (Fila_Vazia(T) == 0){ //Há alunos na Turma Retorno = T->Inicio; if (T->Tamanho == 1){ T->Inicio = NULL; T->Fim = NULL; } else{ Prox = T->Inicio->prox; free (T->Inicio); T->Inicio = Prox; } T->Tamanho--; //AQUI TEM QUE DAR O PUSH } else{ cout << "A pilha está vazia!!" << endl; } return Retorno; } void ImprimeRec_Fila(FilaTurma *T, Numeros *ProxAluno){ if (ProxAluno != NULL){ if (ProxAluno == T->Inicio){ system("cls"); cout<<"Fila:"; } cout<<ProxAluno->val_inser<<" "; ImprimeRec_Fila (T, ProxAluno->prox); } cout<<endl; } //PILHAS ABAIXO -- FILAS A CIMA void Empilhar(Pilhas *T, string val_inser){ Numeros *Elemento; Elemento = Cria_Elemento(val_inser); if (Elemento != NULL){ //Há espaço na pilha Elemento->prox = T->Topo; T->Topo = Elemento; T->Tamanho++; //Crio o novo topo }else{ cout<<"Não há espaço na pilha!!!"<<endl; } } int Pilha_Vazia(Pilhas *T){ //Verifica se a pilha números está vazia (1 - Vazia, 0 - Tem mais de 1 elemento) int Ret; if (T->Tamanho == 0){ Ret = 1; } else{ Ret = 0; } return Ret; } void Desempilhar(Pilhas *T){ int Pos; if (Pilha_Vazia(T) == 0){ //Há alunos na Turma T->Topo = T->Topo->prox; T->Tamanho--; }else{ cout << "Pilha vazia!!!" << endl; } } void Imprime_Pilha_Rec(Pilhas *T, Numeros *prox){ if (prox != NULL){ cout<<prox->val_inser<<endl; Imprime_Pilha_Rec(T, prox->prox); } } int VerifiPreced(Pilhas *O){ //VERIFICA A PRECED SE RET = 1, calcule, senao não calcule Numeros *RetornoRecebido; int ret = 0, Cont; for(Cont = 0; Cont<O->Tamanho; Cont++){ if(RetornoRecebido->val_inser == "+" || RetornoRecebido->val_inser == "-"){ ret = 1; }else{ if(RetornoRecebido->val_inser == "*" || RetornoRecebido->val_inser == "/"){ ret = 0; } } } return ret; } //AINDA não FUNCIONA void Calcule(Pilhas *O, Pilhas *N){ Numeros *RetornoRecebido; float ret; string X1, X2, Operador; X1 = RetornoRecebido->val_inser; X2 = RetornoRecebido->prox->val_inser; X1 = Desempilhar(N->Topo->val_inser);//topo // float X1F = stof (X1); X2 = Desempilhar(N->Topo->val_inser);//prox topo // float X2F = stof(X2); Operador = O->Topo->val_inser; if(Operador == "*"){ ret = X1*X2; }else{ if(Operador == "/"){ }else{ if(Operador == "+"){ }else{ if(Operador == "-"){ } } } } } void DesenfileirarEmpilhando (Pilhas *O, Pilhas *N, FilaTurma *T){ Numeros *RetornoRecebido; int Tam = T->Tamanho, Cont, Preced; string Aux1, Aux2; for(Cont = 0; Cont<Tam; Cont++){ RetornoRecebido = Desenfilerar_Aluno(T); if(RetornoRecebido->val_inser == "+" ||RetornoRecebido->val_inser == "-" || RetornoRecebido->val_inser == "/" || RetornoRecebido->val_inser == "*"){ if(Pilha_Vazia(O) == 1){//PILHA VAZIA Empilhar (O, RetornoRecebido->val_inser); }else{//SE PILHA não VAZIA if(VerifiPreced(O) == 1){ //SE FOR SOMA OU SUBT //Calcule(O,N); //TENHO CERTEZA QUE ELE não VAI EMPILHAR, VAI RESOLVER DIRETO porque SEMPRE VAI SER MENOR OU IGUAL (+-*/) //CALCULE }else{ //SENAO, MULTI OU DIV if(VerifiPreced(O) == 0){ //JA SEI QUE EH SOMA OU DIV if(O->Topo->val_inser == "*" || O->Topo->val_inser == "/"){ //CALCULE }else{ Empilhar(O, RetornoRecebido->val_inser); } } } } }else{ Empilhar(N, RetornoRecebido->val_inser); } } Imprime_Pilha_Rec(N, N->Topo); cout<<endl; Imprime_Pilha_Rec(O, O->Topo); } FilaTurma T; Pilhas O;//Operadores Pilhas N;//Numeros main (){ setlocale (LC_ALL,"Portuguese"); char opc2; string num; int opc; Ini_Fila(&T); //inciialização da fila Ini_Pilhas(&O); Ini_Pilhas(&N); /* do{ cout<<"1-> Enfileirar a operação"<<endl; cout<<"2-> Desenfileirar e resolver"<<endl; cout<<"0-> Sair"<<endl; cin>>opc; switch (opc){ case 1: do{ cout<<"Digite o valor para enfileirar:"<<endl; cin>>num; Enfileirar_Aluno(&T, num); cout<<"Deseja continuar enfileirando? (y -> sim / n -> não)"<<endl; cout<< ":"; cin>> opc2; if(opc2 == 'n'){ Enfileirar_Aluno(&T, "$"); } //system("pause"); }while(opc2 != 'n'); break; case 2: DesenfileirarEmpilhando(&O, &N, &T); system("pause"); break; } }while (opc != 0); */ Enfileirar(&T, "10"); //O OPERADORES / N NUMEROS Enfileirar(&T, "/"); Enfileirar(&T, "20"); Enfileirar(&T, "+"); Enfileirar(&T, "30"); DesenfileirarEmpilhando(&O, &N, &T); //Imprime_Pilha_Rec(&O, O.Topo); system("pause"); // ImprimeRec_Fila(&T, T.Inicio); // Desenfilerar_Aluno(&T); // ImprimeRec_Fila(&T, T.Inicio); }

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...