计算 的程序java_数学表达式计算程序(java)
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)相关推荐
- java 数学表达式解析插件_数学表达式解析-JAVA版
1 .工具介绍 String exp = "v>=10&&v<=2000&&v%10==0"; 在 js 中,能够直接运行 eval 得 ...
- java执行数学表达式_数学表达式解析-JAVA版
1 .工具介绍 String exp = "v>=10&&v<=2000&&v%10==0"; 在 js 中,能够直接运行 eval 得 ...
- 编写python程序输出数学表达式_Python基本编程题
问题1:仅使用 Python 基本语法,即不使用任何模块,编写 Python 程序计算下列数学表达式的结果并输出,小数点后保留3位. ...
- java惰性计算原理_利用 Lambda 表达式实现 Java 中的惰性求值
Java 中惰性求值的潜能,完全被忽视了(在语言层面上,它仅被用来实现 短路求值 ).更先进的语言,如 Scala,区分了传值调用与传名调用,或者引入了 lazy 这样的关键字. 尽管 Java 8 ...
- 数学表达式解析器简介
2019独角兽企业重金招聘Python工程师标准>>> 在实际项目开发中如果需要解析数学公式,无须再运用解释器模式进行设计,可以直接使用一些第三方解析工具包,它们可以统称为数学表达式 ...
- java数学计算表达式_Java初学者:内建函数计算简单的数学表达式
这个应该在之前写的,忘记了,补上 这次我们说一下如何用java计算数学表达式的值,比如,我们要计算sin(pi/3) + cos(pi/6) + 5.6^3,怎么计算呢?这里我们需要用到java的ma ...
- java面向对象实现表达式计算,java面向对象课程设计-数学表达式计算器
项目简介 设计一个计算器,其能够: 1)由用户输入一个简单的四则运算表达式,求出其计算结果后显示. 2)特殊数学函数,如:绝对值.取整.三角函数.倒数.平方根.平方.立方等. 3)对一定范围内的数字将 ...
- java实现计算复杂数学表达式
用过python或者PHP的同学应该知道,它们都有个eval函数,这个函数真的是好用啊,比如我算数的时候就喜欢用python的控制台来当做计算器.比如: Python 3.6.5 (v3.6.5:f5 ...
- Java数学表达式计算(中缀转后缀表达式)
文章目录 前言 中缀表达式转后缀表达式 计算后缀表达式 计算形式公式 声明 前言 数学计算的加减乘除人脑算很简单,但是放到计算中却需要进行一些转换,在正式写Java计算数学表达式前,我们需要先来介绍两 ...
最新文章
- 新疆弃光量下降14% 弃光问题仍然难解
- 4G EPS 的架构模型
- python格式规范的要求_python模块规定的格式,按照这样写,最规范
- Jenkins+Jmeter持续集成笔记(四:定时任务和邮件通知)
- how does framework know the Advertisement model should be used to parse json
- vue-drag-resize实线页面的拖拽与缩放
- 职场人际关系该如何拿捏
- (17)HTML标准文档流
- Android 系统(64)---Android中m、mm、mmm、mma、mmma的区别
- android 注册静态广播接收器VS注册动态广播接收器
- Mirth Connect 源码用eclipse启动
- android 设置壁纸上下显示不全,默认锁屏壁纸及锁屏壁纸被拉伸显示不全的问题...
- 移动终端安全问题分析与解决方案研究
- python发邮件被认定为垃圾邮件_使用Python登陆QQ邮箱发送垃圾邮件 简单实现
- str系列函数详解(包会)
- “嗲”上海文化,女人需要学会的4种气质
- Python Windows发出警报声、蜂鸣器、声音报警
- 采用HTML,CSS,JAVASCRIPT的前端网页设计的内容展示
- [C语言]逆序一个字符串的内容
- startactivity后App出现闪退问题情况分析
热门文章
- 【windows】python安装小结
- 《关键对话》学习总结
- python(numpy,pandas11)——pandas merge根据索引合并数据
- 为什么IEE754标准中,32位浮点数的指数转换为阶码时需要加上数值为127的偏移量?
- LwIP 之五 详解动态内存管理 内存堆(mem.c/h)
- java泛型基类list_泛型:列表?扩展Animal与List Animal相同吗?
- C/Cpp / 类的前向声明、不完全类型和完全类型
- miui9Android8.0更新,MIUI9 暂停更新工作,或为 MIUI 10 将至?
- 关于GPS的1PPS时间同步功能探索与测试
- Create 2021:李彦宏描绘未来交通图景 - 不限购、不限行、无拥堵