Este artigo descreve a implementação do Java de funções simples da calculadora de expressão. Compartilhe -o para sua referência, como segue:
Leia em uma expressão de cálculo inteiro não negativo que contém apenas +, -, *, / e calcula o valor da expressão.
Entrada
A entrada de teste contém vários casos de teste, cada caso de teste ocupa uma linha, com não mais que 200 caracteres por linha, separados por um espaço entre números inteiros e operadores. Não há expressão ilegal. Quando houver apenas 0 em uma linha, a entrada termina e o resultado correspondente não devem ser emitidos.
Saída
Saída 1 linha para cada caso de teste, ou seja, o valor da expressão, exatamente para 2 locais decimais.
Entrada de amostra
1 + 2
4 + 2 * 5 - 7 /11
0
Saída de amostra
3,00
13.36
Esta é uma calculadora simples. Deixe -me explicar o princípio sozinho. Simplificando, é fazer duas pilhas uma para armazenar os valores e a outra para armazenar os símbolos de adição, subtração, multiplicação e divisão. Você também pode usar matrizes, mas a própria função de pilha de Java será muito mais conveniente de usar.
Vale a pena notar que a pilha usada para carregar valores numéricos pode armazenar até dois valores numéricos, o que é para cálculo. Aquele que instala o símbolo é instalar um. Quando encontramos ' *' e '/', primeiro executamos o cálculo e depois pressionamos a pilha. A propósito, ao escrever funções de operação, você deve prestar atenção à ordem das operações. Quando eu mesmo escrevi, fui enganado por um longo tempo por causa do meu descuido.
O código específico é o seguinte:
pacote temp; importar java.util.scanner; importar java.util.stack; public class P1237 {public static void main (string [] args) {scanner sc = new scanner (system.in); String str = sc.NextLine (); while (! str.equals ("0")) {// Quando chegar a 0, use a pilha para fazer pilha <ouble> num = new Stack <ouble> (); // Adicione a pilha de valores <AcLeacter> md = new sTack <caractere> (); // adicione operadores "+", ""*","/"String str1 [] 0; if (num.size () <= 1) {// pelo menos dois números podem ser colocados em num.push (d); }} else {if (md.isempty ()) {// Se o caractere estiver vazio, adicione md.push ((str1 [i]). charat (0)); } else {char md1 = md.peek (); // veja qual símbolo está na camada superior da pilha char md2 = str1 [i] .charat (0); // o símbolo de ii/***, escreva uma função para julgar com base no valor de retorno e qual símbolo para executar primeiro*/ if (optation (md1, md1, md2), e o símbolo da) (*****. A pilha para operar // representa a parte superior da pilha dupla datnum = num.pop (); // representa a parte inferior da pilha // porque é menor ou igual a um, primeiro coloque o símbolo em MD primeiro, depois pressione o símbolo subsequente e depois coloque o resultado em num.push (mathnum, nextnum, md.pOp (); md.push (str1 [i] .Charat (0)); / * Você não pode fazer */ //} else if (opração (md1, md2) == 2 // julgar o próximo símbolo // && i + 2 <str1.length // && opção ((str1 [i + 2]). Charat (0), md2)! // duplo lastNum = num.pop (); // num.push (matemática (nextnum, lastnum, md2)); } else if (opração (md1, md2) == 2) {duplo nextnum = duplo.valueof (str1 [++ i]); // obtenha o próximo duplo lastNum = num.pop (); Num.push (Math (LastNum, NextNum, MD2)); }}}}} if (! md.empty ()) {// Se a pilha do operador não estiver vazia, deve haver dois valores numéricos na pilha numérica dupla nextnum = num.pop (); duplo lastnum = num.pop (); // System.out.printf ("%. 2f", Math (LastNum, NextNum, Md.pop ())); System.out.println (String.Format ("%. 2f", Math (LastNum, NextNum, Md.pop ()))); } else if (num.size () == 1) {// System.out.printf ("%. 2f/n", num.pop ()); System.out.println (string.format ("%. 2f", num.pop ())); } str = sc.NextLine (); // Obtenha a próxima operação}} matemática dupla estática privada (NUM1, Double num2, Pop de caractere) {// Use a caixa de varredura para executar o comutador de operação correspondente (POP) {case ' +': return (num1 + num2); case ' -': retornar num1 - num2; case ' *': retornar num1 * num2; case ' /': retorna num1 / num2; } retornar (duplo) 0; } estática privada int operação (char md1, char md2) {if (md1 == '*' || md1 == '/') {if (md2 == '*' || md2 == '/') {return 0; // se for multiplicação ou divisão, a ordem de operações é o mesmo} {Return 1; ||. for (int i = 0; i <str.Length (); i ++) {if (ch [i] <48 || ch [i]> 57) {return false; }} retornar true; }}PS: Aqui estão algumas ferramentas de cálculo para sua referência:
Ferramenta de conversão/cálculo da expressão matemática on -line:
http://tools.vevb.com/jisuanqi/exp_jisuanqi
Ferramenta de cálculo da solução de função on -line (eq):
http://tools.vevb.com/jisuanqi/equ_jisuanqi
Calculadora científica online use_advanced calculadora online calculadora:
http://tools.vevb.com/jisuanqi/jsqkeexue
Calculadora Online_Standard Calculadora:
http://tools.vevb.com/jisuanqi/jsq
Para obter mais informações sobre os algoritmos Java, os leitores interessados neste site podem visualizar os tópicos: "Estrutura de dados Java e tutorial de algoritmo", "Resumo das dicas de nó da operação Java Dom", "Resumo de dicas de operação de Java e Operação de Java" e "Resumo de Java cache" Tips "TIPS"
Espero que este artigo seja útil para a programação Java de todos.