展开全部

//MathX.java

//表达式计算程序,绝对62616964757a686964616fe4b893e5b19e31333238643066原创,

//与网上多数介绍的方法思路有点不同,

//与采用直接调用js的方法有根本的不同,

//支持 加 减 乘 除 幂 及 开方 运算,支持多级括号,

//本程序在 JDK1.6_11下开发,低版本JDK兼容性未测试,

import java.text.DecimalFormat;

public class MathX {

public static void main(String[] args) {

String str = "83-32+83*32/4+3";

double d = Calc.doCalc(str).getValue();

System.out.println(Calc.getStr()+"="+d);

}

// public static double calc(String s){

//  return Calc.doCalc(s).getValue();

// }

// public static String getStr(){

//  return Calc.getStr();

// }

// public static String getFormatted() {

//  return Calc.getFormatted();

// }

}

class Calc{

private static final DecimalFormat df = new DecimalFormat("0.000000");

private static CalcCore co;

private static NumberWrapper result;

public static NumberWrapper doCalc(String exp){

co = new CalcCore(exp);

result = co.getResult();

return result;

}

public static String getFormatted() {

return df.format(result.getValue());

}

public static String getStr(){return co.toString();}

}

//数据外覆类

class NumberWrapper{

public static final int IaN = 0;

public static final int NaN = 1;

public static final NumberWrapper NOTHING = new NumberWrapper(Double.NaN,NumberWrapper.NaN);

private double value;

private int id;

public NumberWrapper(double v){

this(v,NumberWrapper.IaN);

}

public double getValue(){

return id==NumberWrapper.IaN?value:Double.NaN;

}

public NumberWrapper(double v,int id){

this.value=v;

this.id=id;

}

// +-*/^~

public NumberWrapper calc(NumberWrapper x,char o){

if(this.NaN()||x.NaN())

return NumberWrapper.NOTHING;

return new NumberWrapper(calc(this.getValue(),x.getValue(),o));

}

private double calc(double a,double b,char o){

try{

switch(o){

case OStack.PLUS:return a+b;

case OStack.SUBTRACT:return a-b;

case OStack.MULTIPLY:return a*b;

case OStack.DIVIDE:return a/b;

case OStack.POWER:return Math.pow(a, b);

case OStack.EVOLUTION:return Math.pow(a, 1d/b);

default:return Double.NaN;

}

}catch(Exception e){}

return Double.NaN;

}

public void setId(int id){this.id=id;}

public boolean NaN(){return id==NaN;}

}

class CalcCore{

private NStack n;

private OStack o;

private NumberWrapper result;

private String src;

public CalcCore(String src){

this.src=src;

rebuildString();

this.n=new NStack();

this.o=new OStack();

this.split();

this.calc();

}

public String toString(){

return src;

}

private void rebuildString() {

// (...)(...) --> (...)*(...)

src=src.replaceAll("\\)\\(",")"+OStack.MULTIPLY+"(");

// 1234(...) --> 1234*(...)

// (...)1234 --> (...)*1234

int i=0;

while(i

if(hasNext(i+1)&&this.isNumber(i)&&src.charAt(i+1)==OStack.LB||

hasNext(i+1)&&this.isNumber(i+1)&&src.charAt(i)==OStack.RB){

src=src.substring(0,i+1)+OStack.MULTIPLY+src.substring(i+1);

}

++i;

}

//~1234 -->2~1234

//(~1234) -->(2~1234)

i=0;

while(i

if(src.charAt(i)==OStack.EVOLUTION && pio(i)){

src=src.substring(0,i)+"2"+src.substring(i);

}

++i;

}

}

private void calc() {

for(int i=0; i

char ch = o.get(i);

if(ch==OStack.EVOLUTION||ch==OStack.POWER){

NumberWrapper n0 = n.remove(i);

NumberWrapper n1 = n.remove(i);

ch = o.remove(i);

NumberWrapper rs;

if(ch==OStack.EVOLUTION)

rs = n0.calc(n1, ch);

else

rs = n1.calc(n0, ch);

n.insert(i, rs);

--i;

}

}

for(int i=o.size()-1; i>=0; i--){

char ch = o.get(i);

if(ch==OStack.MULTIPLY||ch==OStack.DIVIDE){

NumberWrapper n0 = n.remove(i+1);

NumberWrapper n1 = n.remove(i);

ch = o.remove(i);

NumberWrapper rs = n0.calc(n1, ch);

n.insert(i, rs);

}

}

for(int i=o.size()-1; i>=0; i--){

char ch = o.get(i);

NumberWrapper n0 = n.remove(i+1);

NumberWrapper n1 = n.remove(i);

ch = o.remove(i);

NumberWrapper rs = n0.calc(n1, ch);

n.insert(i, rs);

}

if(n.isEmpty()||n.size()>1)

result = NumberWrapper.NOTHING;

else

result = n.pop();

}

public NumberWrapper getResult(){

return result;

}

private void split(){

int cont;

for(int i=0; i

char c = src.charAt(i);

switch(c){

case '(':

int pair = nextPair(src,i+1);

String sub = substring(i+1,pair);

n.push(Calc.doCalc(sub));

i=pair;

break;

case '-':

case '+':

boolean iso = pio(i);

cont = continuous(i+1);

if(iso){

n.push(new NumberWrapper(parse(substring(i,cont))));

i=cont-1;

break;

}

case '*':

case '/':

case '%':

case '^':

case '~':o.push(c);break;

default :

cont = continuous(i+1);

n.push(new NumberWrapper(parse(substring(i,cont))));

i=cont-1;

}

}

}

private double parse(String s){

try{

return Double.parseDouble(s);

}catch(Exception e){}

return Double.NaN;

}

private String substring(int i, int cont) {

return src.substring(i,cont);

}

private boolean hasNext(int i){

return src.length()>i;

}

private int continuous(int i) {

while(hasNext(i) && isNumber(i))

++i;

return i;

}

private boolean pio(int i){

return i<1?true:OStack.iso(src.charAt(i-1));

}

public boolean isNumber(int pos){

char c = src.charAt(pos);

return c<='9' && c>='0' || c=='.';

}

public int nextPair(String src,int pos){

int inner = 0;

int len = src.length();

for(int i=pos; i

char c = src.charAt(i);

if(c==')')

if(inner==0)return i;

else --inner;

else if(c=='(')++inner;

}

return -1;

}

}

//操作符栈(半角符号)

class OStack{

public static final char PLUS = '+';

public static final char SUBTRACT = '-';

public static final char MULTIPLY = '*';

public static final char DIVIDE = '/';

public static final char POWER = '^';

public static final char EVOLUTION = '~';

public static final char LB = '(';

public static final char RB = ')';

public static boolean iso(char c) {

switch(c){

case PLUS:

case SUBTRACT:

case MULTIPLY:

case DIVIDE:

case POWER:

case EVOLUTION:

case LB:

//  case RB:

return true;

}

return false;

}

public boolean hasNext(int i) {

return this.length>i+1;

}

private char[] stack;

private int length;

public OStack(){

this.stack=new char[0];

this.length=0;

}

public boolean isEmpty(){

return length==0;

}

public void push(char c){

char[] tmp = new char[this.length+1];

tmp[0]=c;

System.arraycopy(stack, 0, tmp, 1, length);

++length;

this.stack=tmp;

}

public char pop(){

if(this.isEmpty())throw new StackOverflowError();

char c = stack[0];

char[] tmp = new char[length-1];

System.arraycopy(stack, 1, tmp, 0, tmp.length);

--length;

this.stack=tmp;

return c;

}

public char remove(int i){

if(i<0||i>=length)throw new StackOverflowError();

char[] tmp = new char[length-1];

System.arraycopy(stack,0,tmp,0,i);

System.arraycopy(stack,i+1,tmp,i,tmp.length-i);

this.length--;

char n=stack[i];

this.stack=tmp;

return n;

}

public void insert(int i,char n){

if(i<0||i>length)throw new StackOverflowError();

char[] tmp = new char[length+1];

System.arraycopy(stack,0,tmp,0,i);

System.arraycopy(stack,i,tmp,i+1,this.length-i);

tmp[i]=n;

this.length++;

this.stack=tmp;

}

public char get(int i){

return this.stack[i];

}

public int size(){return this.length;}

}

//数据栈

class NStack{

private NumberWrapper[] stack;

private int length;

public NStack(){

this.stack=new NumberWrapper[0];

this.length=0;

}

public NStack(NStack n){

this.stack=new NumberWrapper[n.length];

this.length=n.length;

for(int i=0; i

this.stack[i]=n.stack[i];

}

}

public void push(NumberWrapper d){

NumberWrapper[] tmp = new NumberWrapper[this.length+1];

System.arraycopy(stack, 0, tmp, 1, this.length);

tmp[0] = d;

this.stack=tmp;

this.length++;

}

public NumberWrapper pop() throws StackOverflowError{

if(this.isEmpty())throw new StackOverflowError();

NumberWrapper[] tmp = new NumberWrapper[this.length-1];

System.arraycopy(stack, 1, tmp, 0, tmp.length);

NumberWrapper d = stack[0];

this.stack=tmp;

this.length--;

return d;

}

public NumberWrapper get(int i){

return this.stack[i];

}

public NumberWrapper remove(int i){

if(i<0||i>=length)throw new StackOverflowError();

NumberWrapper[] tmp = new NumberWrapper[length-1];

System.arraycopy(stack,0,tmp,0,i);

System.arraycopy(stack,i+1,tmp,i,tmp.length-i);

this.length--;

NumberWrapper n=stack[i];

this.stack=tmp;

return n;

}

public void insert(int i,NumberWrapper n){

if(i<0||i>length)throw new StackOverflowError();

NumberWrapper[] tmp = new NumberWrapper[length+1];

System.arraycopy(stack,0,tmp,0,i);

System.arraycopy(stack,i,tmp,i+1,this.length-i);

tmp[i]=n;

this.length++;

this.stack=tmp;

}

public boolean isEmpty(){

return this.length==0;

}

public int size(){return this.length;}

}

java 加减乘除_加减乘除运算(Java)相关推荐

  1. java大整数的加减乘除_关于大整数的加减乘除求余运算 java

    自己用java 实现了大字符串整数的加减乘除和求余运算, 加减法的算法是模拟手工笔算的计算过程, 除法就是从最高位不停的减操作, 乘法的算法 :遍历一个数的各个位数以及他所在位置,另一个数根据这个数的 ...

  2. java 级数_编写一个Java程序实现级数运算。

    编写一个Java程序实现级数运算.其中:定义级数求和类,以及级数求积(阶乘)类,在项目主类中声明一个级数求和对象和求阶乘对象,由键盘输入级数的n值,并打印出1+2+...+n的和,以及... 编写一个 ...

  3. 用java写四则混合运算,JAVA写的四则混合运算-JSP教程,Java技巧及代码

    这是一个四则混合运算程序,没什么做优化,也没做什么注释,(人啊,总喜欢偷懒的.) 这个版本我已经定为了2.21版本.呵呵. 从最先的1.0到2.0的改动很大.除了运算思想没动处,其它的都在2.0做了重 ...

  4. java 抛出异常_我的Java Web之路51 - Java异常基础

    本系列文章旨在记录和总结自己在Java Web开发之路上的知识点.经验.问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人. 目录 介绍 异常的本质 Java异常的设计 Java异 ...

  5. groovy 使用java类_深入学习java中的Groovy 和 Scala 类

    前言 Java 传承的是平台,而不是语言.有超过 200 种语言可以在 JVM 上运行,它们之中不可避免地会有一种语言最终将取代 Java 语言,成为编写 JVM 程序的最佳方式.本系列将探讨三种下一 ...

  6. java 枚举_深入理解Java枚举

    所有知识体系文章,[GitHub](https://github.com/Ziphtracks/JavaLearningmanual)已收录,欢迎Star!再次感谢,愿你早日进入大厂! https:/ ...

  7. java翻译程序_有没有java代码翻译软件?

    展开全部 没有翻译软件,但是能32313133353236313431303231363533e78988e69d8331333365646333编写翻译程序. java 代码翻译实例: 1.输入一个 ...

  8. java樱花_初步学习java专业课程

    初步学习java编程一. 终于触碰到专业课了(有点小兴奋) 计算机语言:人类与计算机交流的语言! 特点:简洁.准确. 计算机语言分为1.二进制语言2.汇编语言3.C/C++{Java之父   Jame ...

  9. opencv java 摄像头_使用OpenCV Java创建Windows摄像头扫码程序

    OpenCV提供了一些基本的Webcam控制接口.用OpenCV C/C++或者Python,可以在任意平台快速创建一个摄像头预览应用.然而使用Java,情况就复杂的多,因为OpenCV Java并没 ...

  10. java横线_知识点:java一些方法会有横线?以Date 过期方法为例

    原因:他们的开发者在升级方法后,添加了@Deprecated注释, 目的是为了提醒我们,这个方法现在已经有新的方法了,不建议继续使用! 比如: JAVA中Date的tolocalstring为什么不建 ...

最新文章

  1. 吴恩达机器学习资源汇总帖
  2. html两条下划线重叠,文字和text-decoration:underline下划线重叠问题
  3. 从实战中了解数据开发全流程——DataWorks OpenAPI实战
  4. Git的基本概念/常用命令及实例
  5. python中plt定义,对Python中plt的画图函数详解
  6. Sybase获取所有用户表,以及所有者(owner)
  7. 编解码学习笔记(九) QuickTime系列
  8. layui 模板判断_layui之模板弹框
  9. linux下lamealsa进行音频流操作(一)lame知识介绍
  10. java获取虎牙直播弹幕消息,虎牙直播弹幕筛选器
  11. Java桌面应用程序设计新贵:SWT 简介
  12. eclipse背景怎么改颜色
  13. centos Iptables学习笔记
  14. 7月刊精彩推荐 李德毅:云计算热点分析
  15. 修改sep客户端服务器地址,SEP服务更改IP地址操作手册
  16. SQL SERVER 生僻字查询问题和关键字COLLATE
  17. 多普达830玩友玩祖玛的时候要小心啊
  18. CMS:内容(文章)管理系统
  19. 各种计算机语言的经典书籍(C/C++/Java/C#/VC/VB等)
  20. Ubuntu14安装配置samba共享功能

热门文章

  1. 开热点给电脑消耗大吗_电脑连热点流量消耗大吗
  2. 足球相声:我现在真的火了
  3. 计算机网络路由器作用是什么,路由器的作用是什么? 猫和路由器的区别分析【图文】...
  4. HTTP 417 错误 Expectation Failed
  5. qt远程调试ARM板
  6. noob学python #1
  7. css3顺时,CSS3 - 顺时针旋转比逆时针
  8. namecheap域名如何绑定IP
  9. kvm实战之搭建一个web服务来进行ks.cfg文件的引导(三)
  10. 读书笔记之《梁宁增长思维30讲》