package com.calculator.biz; import java.util.*; /** * http://www.360doc.com/content/10/0919/11/2437645_54818470.shtml * * * 基于计算器算法二{浮点精度计算}【堆栈处理】 * * @author Dawning * */ public class CountExpression { static String[] operater = new String[20]; static String[] number = new String[20]; static String[] operater1 = new String[20]; public double countExpression(String str) { // initialized two stack Stack countStack1 = new Stack(); Stack countStack2 = new Stack(); double result = 0; int v = 0; // 截取它的操作符 number = str.split("///|//*|//+|//-"); operater = str.split("//d+"); // 获取非null数组 for (int j = 0; j < operater.length; j++) { if (!operater[j].equals(null) && !operater[j].equals("")) { operater1[v] = operater[j]; v++; } } // 5/3+3*0.2+7-8 for (int i = 0; i < number.length; i++) { //System.out.print(number[i]); countStack1.push(number[i]); for (int j = 0; j < operater1.length; j++) { if (null != operater1[j]) { if (!operater1[j].equals(".")) { String op = operater1[j]; //System.out.print(op); countStack1.push(op); operater1[j] = null; break; } } } } while (!countStack1.isEmpty()) countStack2.push(countStack1.pop()); String op; while (!countStack2.isEmpty()){ result = 0; op = countStack2.pop().toString(); if (op.equals("*")) { result = Double.parseDouble(countStack1.pop().toString()) * Double.parseDouble(countStack2.pop().toString()); System.out.println("*__"+result); countStack1.push(result); continue; } if (op.equals("/")) { result = Double.parseDouble(countStack1.pop().toString()) / Double.parseDouble(countStack2.pop().toString()); System.out.println("/__"+result); countStack1.push(result); continue; } countStack1.push(op); } while (!countStack1.isEmpty()) countStack2.push(countStack1.pop()); while (!countStack2.isEmpty()) { op = countStack2.pop().toString(); if (op.equals("+")) { result = Double.parseDouble(countStack1.pop().toString()) + Double.parseDouble(countStack2.pop().toString()); countStack1.push(result); System.out.println("+__"+result); continue; } if (op.equals("-")) { result = Double.parseDouble(countStack1.pop().toString()) - Double.parseDouble(countStack2.pop().toString()); countStack1.push(result); System.out.println("/__"+result); continue; } countStack1.push(op); } return result; } public static void main(String[] args) { double num; CountExpression ct = new CountExpression(); num = ct.countExpression("0.6+0.4+2*2-2/2"); System.out.println(num); } }