public

class

Test {

public

static

void

main(String[] args) { String str

=

"

40944.0501-3.2*100

"

; Calculator cal

=

new

Calculator();

double

d

=

cal.eval(str); System.out.println(d); } }

public

interface

MathSymbol {

/**

* 左括号

*/

public

final

static

char

LEFT_BRACKET

=

'

(

'

;

/**

* 右括号

*/

public

final

static

char

RIGHT_BRACKET

=

'

)

'

;

/**

* 中缀表达式中的空格,需要要忽略

*/

public

final

static

char

BLANK

=

'

'

;

/**

* 小数点符号

*/

public

final

static

char

DECIMAL_POINT

=

'

.

'

;

/**

* 负号

*/

public

final

static

char

NEGATIVE_SIGN

=

'

-

'

;

/**

* 正号

*/

public

final

static

char

POSITIVE_SIGN

=

'

+

'

;

/**

* 后缀表达式的各段的分隔符

*/

public

final

static

char

SEPARATOR

=

'

'

; }

import

java.util.Stack;

public

class

Calculator

implements

MathSymbol {

/**

* 计算中缀表达式 *

@param

expression *

@return

*/

public

double

eval(String expression) { String str

=

infix2Suffix(expression);

//

System.out.println(" Infix Expression: " + expression);

//

System.out.println("Suffix Expression: " + str);

if

(str

==

null

) {

throw

new

IllegalArgumentException(

"

Expression is null!

"

); } String[] strs

=

str.split(

"

//s+

"

); Stack

<

String

>

stack

=

new

Stack

<

String

>

();

for

(

int

i

=

0

; i

<

strs.length; i

++

) {

if

(

!

Operator.isOperator(strs[i])) { stack.push(strs[i]); }

else

{ Operator op

=

Operator.getInstance(strs[i]);

double

right

=

Double.parseDouble(stack.pop());

double

left

=

Double.parseDouble(stack.pop());

double

result

=

op.eval(left, right); stack.push(String.valueOf(result)); } }

return

Double.parseDouble(stack.pop()); }

/**

* 将中缀表达式转换为后缀表达式 *

@param

expression *

@return

*/

public

String infix2Suffix(String expression) {

if

(expression

==

null

) {

return

null

; }

char

[] chs

=

expression.toCharArray(); Stack

<

Character

>

stack

=

new

Stack

<

Character

>

(); StringBuilder sb

=

new

StringBuilder(chs.length);

boolean

appendSeparator

=

false

;

boolean

sign

=

true

;

for

(

int

i

=

0

; i

<

chs.length; i

++

) {

char

c

=

chs[i];

if

(c

==

BLANK) {

continue

; }

//

Next line is used output stack information.

//

System.out.printf("%-20s %s%n", stack, sb.toString());

if

(appendSeparator) { sb.append(SEPARATOR); appendSeparator

=

false

; }

if

(isSign(c)

&&

sign) { sb.append(c);

continue

; }

if

(isNumber(c)) { sign

=

false

; sb.append(c);

continue

; }

if

(isLeftBracket(c)) { stack.push(c);

continue

; }

if

(isRightBracket(c)) { sign

=

false

;

while

(stack.peek()

!=

LEFT_BRACKET) { sb.append(SEPARATOR); sb.append(stack.pop()); } stack.pop();

continue

; } appendSeparator

=

true

;

if

(Operator.isOperator(c)) { sign

=

true

;

if

(stack.isEmpty()

||

stack.peek()

==

LEFT_BRACKET) { stack.push(c);

continue

; }

int

precedence

=

Operator.getPrority(c);

while

(

!

stack.isEmpty()

&&

Operator.getPrority(stack.peek())

>=

precedence) { sb.append(SEPARATOR); sb.append(stack.pop()); } stack.push(c); } }

while

(

!

stack.isEmpty()) { sb.append(SEPARATOR); sb.append(stack.pop()); }

return

sb.toString(); }

/**

* 判断某个字符是否是正号或者负号 *

@param

c *

@return

*/

private

boolean

isSign(

char

c) {

if

(c

==

NEGATIVE_SIGN

||

c

==

POSITIVE_SIGN) {

return

true

; }

return

false

; }

/**

* 判断某个字符是否为数字或者小数点 *

@param

c *

@return

*/

private

boolean

isNumber(

char

c) {

if

((c

>=

'

0

'

&&

c

<=

'

9

'

)

||

c

==

DECIMAL_POINT) {

return

true

; }

return

false

; }

/**

* 判断某个字符是否为左括号 *

@param

c *

@return

*/

private

boolean

isLeftBracket(

char

c) {

return

c

==

LEFT_BRACKET; }

/**

* 判断某个字符是否为右括号 *

@param

c *

@return

*/

private

boolean

isRightBracket(

char

c) {

return

c

==

RIGHT_BRACKET; } }

计算 的程序java_数学表达式计算程序(java)相关推荐

  1. java 数学表达式解析插件_数学表达式解析-JAVA版

    1 .工具介绍 String exp = "v>=10&&v<=2000&&v%10==0"; 在 js 中,能够直接运行 eval 得 ...

  2. java执行数学表达式_数学表达式解析-JAVA版

    1 .工具介绍 String exp = "v>=10&&v<=2000&&v%10==0"; 在 js 中,能够直接运行 eval 得 ...

  3. 编写python程序输出数学表达式_Python基本编程题

    问题1:仅使用 Python 基本语法,即不使用任何模块,编写 Python 程序计算下列数学表达式的结果并输出,小数点后保留3位.‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬ ...

  4. java惰性计算原理_利用 Lambda 表达式实现 Java 中的惰性求值

    Java 中惰性求值的潜能,完全被忽视了(在语言层面上,它仅被用来实现 短路求值 ).更先进的语言,如 Scala,区分了传值调用与传名调用,或者引入了 lazy 这样的关键字. 尽管 Java 8 ...

  5. 数学表达式解析器简介

    2019独角兽企业重金招聘Python工程师标准>>> 在实际项目开发中如果需要解析数学公式,无须再运用解释器模式进行设计,可以直接使用一些第三方解析工具包,它们可以统称为数学表达式 ...

  6. java数学计算表达式_Java初学者:内建函数计算简单的数学表达式

    这个应该在之前写的,忘记了,补上 这次我们说一下如何用java计算数学表达式的值,比如,我们要计算sin(pi/3) + cos(pi/6) + 5.6^3,怎么计算呢?这里我们需要用到java的ma ...

  7. java面向对象实现表达式计算,java面向对象课程设计-数学表达式计算器

    项目简介 设计一个计算器,其能够: 1)由用户输入一个简单的四则运算表达式,求出其计算结果后显示. 2)特殊数学函数,如:绝对值.取整.三角函数.倒数.平方根.平方.立方等. 3)对一定范围内的数字将 ...

  8. java实现计算复杂数学表达式

    用过python或者PHP的同学应该知道,它们都有个eval函数,这个函数真的是好用啊,比如我算数的时候就喜欢用python的控制台来当做计算器.比如: Python 3.6.5 (v3.6.5:f5 ...

  9. Java数学表达式计算(中缀转后缀表达式)

    文章目录 前言 中缀表达式转后缀表达式 计算后缀表达式 计算形式公式 声明 前言 数学计算的加减乘除人脑算很简单,但是放到计算中却需要进行一些转换,在正式写Java计算数学表达式前,我们需要先来介绍两 ...

最新文章

  1. 新疆弃光量下降14% 弃光问题仍然难解
  2. 4G EPS 的架构模型
  3. python格式规范的要求_python模块规定的格式,按照这样写,最规范
  4. Jenkins+Jmeter持续集成笔记(四:定时任务和邮件通知)
  5. how does framework know the Advertisement model should be used to parse json
  6. vue-drag-resize实线页面的拖拽与缩放
  7. 职场人际关系该如何拿捏
  8. (17)HTML标准文档流
  9. Android 系统(64)---Android中m、mm、mmm、mma、mmma的区别
  10. android 注册静态广播接收器VS注册动态广播接收器
  11. Mirth Connect 源码用eclipse启动
  12. android 设置壁纸上下显示不全,默认锁屏壁纸及锁屏壁纸被拉伸显示不全的问题...
  13. 移动终端安全问题分析与解决方案研究
  14. python发邮件被认定为垃圾邮件_使用Python登陆QQ邮箱发送垃圾邮件 简单实现
  15. str系列函数详解(包会)
  16. “嗲”上海文化,女人需要学会的4种气质
  17. Python Windows发出警报声、蜂鸣器、声音报警
  18. 采用HTML,CSS,JAVASCRIPT的前端网页设计的内容展示
  19. [C语言]逆序一个字符串的内容
  20. startactivity后App出现闪退问题情况分析

热门文章

  1. 【windows】python安装小结
  2. 《关键对话》学习总结
  3. python(numpy,pandas11)——pandas merge根据索引合并数据
  4. 为什么IEE754标准中,32位浮点数的指数转换为阶码时需要加上数值为127的偏移量?
  5. LwIP 之五 详解动态内存管理 内存堆(mem.c/h)
  6. java泛型基类list_泛型:列表?扩展Animal与List Animal相同吗?
  7. C/Cpp / 类的前向声明、不完全类型和完全类型
  8. miui9Android8.0更新,MIUI9 暂停更新工作,或为 MIUI 10 将至?
  9. 关于GPS的1PPS时间同步功能探索与测试
  10. Create 2021:李彦宏描绘未来交通图景 - 不限购、不限行、无拥堵