Olá estou desenvolvendo uma calculadora que recebe como parâmetro de entrada uma expressão normal como essa 2+3+5+7*(8/2), e tem que me retornar ela em notação polonesa ,porem estou com algumas dificuldades na hora de definir a prioridade dos operadores e com os parenteses se alguem puder me dar uma dica do que posso melhorar agradeço .
Segue Parte do Código que avalia a Expressão (lembrando que sou obrigado a usar Pilha e Fila ).
publicclassCalculadoraPolonesa{privateFilafilaAuxiliar;privatePilhapilha;publicCalculadoraPolonesa(){filaAuxiliar=newFila();pilha=newPilha();}publicvoidavaliaExpressao(Stringentrada)throwsEmptyStackException{for(inti=0;i<entrada.length();i++){charc=entrada.charAt(i);if(!eEspaco(c)){Stringaux="";if(eNumerico(c)){while(eNumerico(c)){aux+=c;c=entrada.charAt(++i);}//converte a String para um inteirofilaAuxiliar.inserir(Integer.parseInt(aux));}if(c=='('){pilha.push(c);}elseif(c==')'){while(true){Objectx=pilha.pop();if(x.equals('(')){break;}filaAuxiliar.inserir(x);break;}}elseif(eOperador(c)){ObjectoperadorTopoPilha=null;if(pilha.isEmpty()){pilha.push(c);}else{operadorTopoPilha=pilha.pop();while(true){if(testaPrioridade(c,operadorTopoPilha.toString().charAt(0))||pilha.isEmpty()){pilha.push(c);break;}else{filaAuxiliar.inserir(pilha.pop());i++;}}}}}}while(!pilha.isEmpty()){filaAuxiliar.inserir(pilha.pop());}}privatebooleaneOperador(charc){return(c=='+'||c=='-'||c=='*'||c=='/');}privatebooleaneNumerico(charc){return(c>='0'&&c<='9');}privatebooleaneEspaco(charc){return((int)c)==' ';}privatebooleantestaPrioridade(charp2,charp1){return((p2=='*'||p2=='/')&&(p1=='+'||p1=='-'));}publicStringimprimeExpressaoPolonesa(){returnfilaAuxiliar.imprimir();}}
Bom com esses links acho que dá para ver algumas formas de fazer.
Espero ter ajudado um pouco.
Abraço.
G
GabrielMantini
Cara, você precisa mesmo implementar isso? E se precisar, tem que ser em java?
Isso sai fácil usando arvore, mas fazer arvore em java…
Eu aconselho a fazer pseudocódigo mesmo, ou implementar em C ou Pascal, que ai você brinca com os ponteiros e todas essas palhaçadas. Mas aviso logo, é muito trabalhoso brincar disso…
JavaDreams
GabrielMantini:
Cara, você precisa mesmo implementar isso? E se precisar, tem que ser em java?
Isso sai fácil usando arvore, mas fazer arvore em java…
Eu aconselho a fazer pseudocódigo mesmo, ou implementar em C ou Pascal, que ai você brinca com os ponteiros e todas essas palhaçadas. Mas aviso logo, é muito trabalhoso brincar disso…
Por isso que não quis postar nada a mais que vídeos e sites com exemplos já feitos.
Vai saber a trabalheira que isso vai dar, sem contar que já pode existir uma pronta
para consulta didática.
Funciona bem, se quiser consultar, está no github. É só clicar aqui.
G
GabrielMantini
É, eu to falando que é trabalhoso pq tentei fazer o mesmo, que o nosso amigo aqui, período passado na faculdade. Desisti de fazer em java e implementei em pascal, mas jamais faria aquilo de novo, perdi muito tempo pra acertar, sem contar que é um saco trabalhar com uma expressão toda em string e converter os valores, ainda mais no caso dos operadores.
Pq, pelo menos no meu caso, eu ainda tinha que calcular o valor de todas as formas(parentizada, polonesa e polonesa reversa).
Rodrigo_Sasaki
Se conseguir separar bem, até que é simples implementar seguindo o pseudo-código do wikipedia.
Se alguém reparar no exemplo que eu passei, vai ver que boa parte da lógica foi colocada no enum Operator, onde criei métodos pra facilitar a minha vida
Cervelin
lordabel, tente achar algum tempinho para estudar sobre design patterns. Vc consegue fazer esse algoritmo ficar show de bola se estudar padrões.
Não perca tempo fazendo tudo estruturado não…
L
lordabel
Obrigado Galera pela as Resposta mas , ainda estou na faculdade e era obrigatório o uso de Pilha e Fila ,e eu consegui fazer, fico bem legal irei postar aqui o resultado para que vocês digam o que acham do código que eu fiz.
Segue o codigo terminado é funcionando .
packageCalculadoraPolonesa;publicclassCalculadora{privateFilafila;privatePilhapilha;publicCalculadora(){fila=newFila();pilha=newPilha();}/** * Testa a prioridade dos Operadores. * * @param Object object * @return inteiro */privateintObterPrioridade(Objectobject){intretorno=0;Stringpri1="+-";Stringpri2="*/";if("(".equals(object.toString())){retorno=1;}elseif(pri1.indexOf(object.toString())>=0){retorno=2;}elseif(pri2.indexOf(object.toString())>=0){retorno=3;}elseif("^".equals(object.toString())){retorno=4;}returnretorno;}/** * Testa se é um Numero. * * @param String digit * @return True or False */publicstaticbooleanisADigit(Stringdigit){returndigit.matches("^[0-9]{1,3}$");}/** * Testa se é Um Operador. * * @param String ch * @return True or False */privatebooleanoperador(Stringch){returnch.matches("[+|\\-|*|/|^]");}/** * Converte a expressao de forma Infixa para Poxfixa * * @param String expInfixa */privatevoidConverterPosFixa(StringexpInfixa){Stringitem;expInfixa.trim();String[]caracter=expInfixa.split("");intprioridade=0;/* * Varre todos os elementos da expressao de entrada e, para cada * elemento, verifica se e operador ou parenteses adiciona a pilha. Se * for operando adicona a fila. */for(inti=1;i<=expInfixa.length();i++){if((isADigit(caracter[i]))&&(!caracter[i].matches("[(|)]"))){fila.enqueue(caracter[i]);}elseif(operador(caracter[i])){prioridade=ObterPrioridade(caracter[i]);while((pilha.getLength()!=0)&&(ObterPrioridade((pilha.peek()))>=prioridade)){fila.enqueue(pilha.pop().toString());}// Insere o objeto no topo da pilhapilha.push(caracter[i]);}elseif("(".equals(caracter[i])){// Insere o objeto no topo da pilhapilha.push(caracter[i]);}elseif(")".equals(caracter[i])){item=pilha.pop().toString();fila.enqueue(item);while(!item.equals("(")&&!pilha.isEmpty()){// Recupera e remove o objeto do topo da pilhaitem=pilha.pop().toString();}}}/** * Desimpilha todos Objetos e insere na Fila. */while(!pilha.isEmpty()){fila.enqueue(pilha.pop().toString());}}/** * Avalia uma expressao na forma infixa, mas antes de avaliar, converte-a * para forma posfixa. * * @param String expInfixa * @return resultado da expressao * @throws Exception */publicStringAvaliarExpressao(StringexpInfixa)throwsException{ConverterPosFixa(expInfixa);while(!fila.vazia()){if(isADigit(fila.topoFila().toString())){pilha.push(fila.equeue().toString());}else{if(operador(fila.topoFila().toString())){doubley=Double.parseDouble(pilha.pop().toString());doublex=Double.parseDouble(pilha.pop().toString());switch(fila.equeue().toString()){case"+":pilha.push((x+y));break;case"-":pilha.push((x-y));break;case"*":pilha.push((x*y));break;case"/":pilha.push((x/y));break;case"^":pilha.push((Math.pow(x,y)));break;}}}}returnpilha.pop().toString();}}
Rodrigo_Sasaki
Opa, que bom que conseguiu resolver Mas segue umas dicas:
Para melhorar sua nota:
Nunca comece o nome de um método com letra em maiúsculo, é convencional começar com o nome minúsculo, e a cada troca de palavra a primeira letra é maiúscula. Ex: “openConnection”, “getPartialContent”. (Se eu fosse o professor eu me atentaria a isso)
Se tiver interesse em seguir carreira como programador:
Divida melhor seu código, cada classe deve ter uma única responsabilidade (SRP), deve ser coesa.
Pesquise por padrões para deixar seu código mais limpo e organizado, no caso o padrão Strategy te ajudaria bastante.
Resumidamente é isso aí
Abraço!
JavaDreams
Rodrigo Sasaki:
Opa, que bom que conseguiu resolver Mas segue umas dicas:
Para melhorar sua nota:
Nunca comece o nome de um método com letra em maiúsculo, é convencional começar com o nome minúsculo, e a cada troca de palavra a primeira letra é maiúscula. Ex: “openConnection”, “getPartialContent”. (Se eu fosse o professor eu me atentaria a isso)
Se tiver interesse em seguir carreira como programador:
Divida melhor seu código, cada classe deve ter uma única responsabilidade (SRP), deve ser coesa.
Pesquise por padrões para deixar seu código mais limpo e organizado, no caso o padrão Strategy te ajudaria bastante.
Resumidamente é isso aí
Abraço!
Boa!
Tem material sobre OO nos livros
Java Use a Cabeça
e
Java Como Programar
Sobre padrões
tem o Design Patterns da Sierra também.
S
Sharigan2013
JavaDreams:
GabrielMantini:
Cara, você precisa mesmo implementar isso? E se precisar, tem que ser em java?
Isso sai fácil usando arvore, mas fazer arvore em java…
Eu aconselho a fazer pseudocódigo mesmo, ou implementar em C ou Pascal, que ai você brinca com os ponteiros e todas essas palhaçadas. Mas aviso logo, é muito trabalhoso brincar disso…
Por isso que não quis postar nada a mais que vídeos e sites com exemplos já feitos.
Vai saber a trabalheira que isso vai dar, sem contar que já pode existir uma pronta
para consulta didática.