Este artículo describe la implementación de Java de las funciones de calculadora de expresión simple. Compártelo para su referencia, como sigue:
Leer en una expresión de cálculo entero no negativo que contiene solo +, -, *, / y calcula el valor de la expresión.
Aporte
La entrada de prueba contiene varios casos de prueba, cada caso de prueba ocupa una línea, con no más de 200 caracteres por línea, separados por un espacio entre enteros y operadores. No hay expresión ilegal. Cuando solo hay 0 en una fila, la entrada termina y el resultado correspondiente no debe ser salido.
Producción
Salida 1 línea para cada caso de prueba, es decir, el valor de la expresión, exactamente a 2 decimales.
Entrada de muestra
1 + 2
4 + 2 * 5 - 7/11
0
Salida de muestra
3.00
13.36
Esta es una calculadora simple. Déjame explicarte el principio. En pocas palabras, es hacer dos pilas una para almacenar los valores y el otro para almacenar los símbolos de suma, resta, multiplicación y división. También puede usar matrices, pero la función de pila de Java será mucho más conveniente de usar.
Vale la pena señalar que la pila utilizada para cargar valores numéricos puede almacenar hasta dos valores numéricos, lo cual es para el cálculo. El que instala el símbolo es instalar uno. Cuando encontramos ' *' y '/', primero realizamos el cálculo y luego presionamos la pila. Por cierto, al escribir funciones de operación, debe prestar atención al orden de las operaciones. Cuando lo escribí yo mismo, fui engañado durante mucho tiempo debido a mi descuido.
El código específico es el siguiente:
paquete temp; import java.util.scanner; import java.util.stack; clase pública P1237 {public static void main (string [] args) {Scanner sc = new Scanner (System.in); Cadena str = sc.nextline (); while (!str.equals("0")) {// When it reaches 0, use the stack to do Stack<Double> num = new Stack<Double>();// Add the value Stack<Character> md = new Stack<Character>();// add operators "+", "-", "*", "/" String str1[] = str.split(" ");// Use a new array to divide for (int i = 0; if (num.size () <= 1) {// se pueden poner al menos dos números en num.push (d); }} else {if (md.isempty ()) {// Si el carácter está vacío, agregue en md.push ((str1 [i]). charat (0)); } else {char md1 = md.peek (); // Vea qué símbolo hay en la capa superior de la pila char md2 = str1 [i] .charat (0); // El símbolo de II/** escribamos una función para juzgar basado en el valor de retorno, y qué símbolo para ejecutar primero*/ if (opration (md1, md2) <= 1) la pila para operar // representa la parte superior de la pila doble lastNum = num.pop (); // representa la parte inferior de la pila // porque es menor o igual a una, primero establezca el símbolo en md primero, luego presione el símbolo posterior y luego coloque el resultado en num.push (math (lastnum, nextnum, md.pop ())); md.push (str1 [i] .charat (0)); / * Puede hacerlo */ //} más if (opration (md1, md2) == 2 // juzga el siguiente símbolo // && i + 2 <str1.length // && option ((str1 [i + 2]). Charat (0), md2)! = 1) {// double nextnum = double.valuef (str1 [i + 1]); // double LastNum = num.pop (); // num.push (math (nextnum, dastNum, md2)); } else if (opration (md1, md2) == 2) {double nextnum = double.ValueOf (str1 [++ i]); // Obtenga el próximo doble dastNum = num.pop (); num.push (math (lastNum, NextNum, MD2)); }}}}} if (! md.empty ()) {// Si la pila del operador no está vacía, debe haber dos valores numéricos en la pila numérica doble nextnum = num.pop (); double LastNum = num.pop (); // system.out.printf ("%. 2f", matemáticas (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 (); // Obtenga la siguiente operación}} private static double Math (doble num1, doble num2, pop de caracteres) {// use el caso de barrido para realizar el interruptor de operación coincidente (pop) {case ' +': return (num1 + num2); caso ' -': return num1 - num2; caso ' *': return num1 * num2; caso ' /': return num1 / num2; } return (doble) 0; } Operación privada estática INT (char md1, char md2) {if (md1 == '*' || md1 == '/') {if (md2 == '*' || md2 == '/') {return 0; // Si ambos son multiplicación o división de la división de las operaciones es el mismo} otra. || md2 == '/') {return 2; // ejecutar md2 primero}} return 0; // El orden de adición y resta es el mismo} // determinar si es un número privado de boolean isnumber (string str) {char ch [] = str.ToCarArray (); for (int i = 0; i <str.length (); i ++) {if (ch [i] <48 || ch [i]> 57) {return false; }} return verdadero; }}PD: Aquí hay algunas herramientas de cálculo para su referencia:
Expresión matemática en línea Herramienta de conversión/cálculo simple:
http://tools.vevb.com/jisuanqi/exp_jisuanqi
Herramienta de cálculo de la solución de la función unary (ecualización):
http://tools.vevb.com/jisuanqi/equ_jisuanqi
Calculadora científica en línea use_advanced calculadora en línea:
http://tools.vevb.com/jisuanqi/jsqkeexue
Calculadora en línea_standard Calculadora:
http://tools.vevb.com/jisuanqi/jsq
Para obtener más información sobre los algoritmos de Java, los lectores interesados en este sitio pueden ver los temas: "Estructura de datos Java y tutorial de algoritmo", "Resumen de las puntas de nodo de operación de Java DOM", "Resumen de Java Archivo y TIPS de operación de directorio" y "Summary of Java Cache Operation Tips" TIPS ""
Espero que este artículo sea útil para la programación Java de todos.