java 四则混合运算_Java实现四则混合运算代码示例
使用栈来实现,可以处理运算优先级。
使用自然四则运算表达式即可,如:4+(3*(3-1)+2)/2。无需把表达式先转换为逆波兰等形式。
package com.joshua.cal;
import java.util.collections;
import java.util.hashmap;
import java.util.hashset;
import java.util.linkedlist;
import java.util.list;
import java.util.map;
import java.util.set;
import java.util.stack;
public class calculator {
private final stack numstack = new stack();
private final stack opstack = new stack();
private char currentoperator;
private char opstacktop;
private int i;
private string expression;
@suppresswarnings("rawtypes")
public void exec(string expression) {
try {
clean();
if (expression == null || expression.isempty()) {
throw new illegalargumentexception("blank expression!");
}
this.expression = expression;
opstack.push(terminate_tokens.start_end_mark);
list tokens = tokenizer.exec(expression
+ terminate_tokens.start_end_mark);
for (; i < tokens.size(); i++) {
final object token = tokens.get(i);
if (token instanceof double) {
processoperand((double) token);
} else {
processoperator((char) token);
}
}
} catch (throwable e) {
system.err.println(string.format(
"incorret expression: %s\nerror: %s", expression,
e.getmessage()));
}
}
private void processoperand(final double operand) {
numstack.push(operand);
}
private void processoperator(final char currentoperator) {
this.currentoperator = currentoperator;
this.opstacktop = opstack.peek();
char calmode = calculate_mode.getrule(currentoperator, opstacktop);
switch (calmode) {
case '>':
processstackhigerpriorityoperator();
break;
case '
processstacklowerpriorityoperator();
break;
case '=':
processstackequalpriorityoperator();
break;
default:
break;
}
}
private void processstacklowerpriorityoperator() {
opstack.push(currentoperator);
}
private void processstackhigerpriorityoperator() {
numstack.push(calculate.exec(opstack.pop(), numstack.pop(),
numstack.pop()));
--i; // pointer back to the previous operator.
}
private void processstackequalpriorityoperator() {
if (terminate_tokens.start_end_mark == currentoperator) {
system.out.println(expression + " = " + numstack.peek());
} else if (')' == currentoperator) {
opstack.pop();
}
}
public void clean() {
numstack.clear();
opstack.clear();
i = 0;
}
public static void main(string[] args) {
calculator cal = new calculator();
cal.exec("4+(3*(3-1)+2)/2"); // = 8
cal.exec("4 + (-3 * ( 3 - 1 ) + 2)"); // = 0
cal.exec("4 +-/ (-3 * ( 3 - 1 ) + 2)"); // incorrect expression!
cal.exec("4.5+(3.2+3)/2"); // = 7.6
cal.exec("4.5+(3.2:3)/2"); // incorrect expression!
cal.exec("-4.5+(3.2-3)/2"); // = -4.4
}
}
enum calculate {
instance;
public static double exec(final char operator, final double right,
final double left) {
switch (operator) {
case '+':
return left + right;
case '-':
return left - right;
case '*':
return left * right;
case '/':
return left / right;
default:
throw new illegalargumentexception("unsupported operator: "
+ operator);
}
}
}
enum terminate_tokens {
instance;
public static final char start_end_mark = '#';
private static final map tokens = new hashmap();
static {
// token, token id
tokens.put('+', 0);
tokens.put('-', 1);
tokens.put('*', 2);
tokens.put('/', 3);
tokens.put('(', 4);
tokens.put(')', 5);
tokens.put(start_end_mark, 6);
}
private static set negative_num_sensitive = new hashset();
public static synchronized set getnegativenumsensitivetoken() {
if (negative_num_sensitive.size() == 0) {
negative_num_sensitive.addall(tokens.keyset());
negative_num_sensitive.remove(')');
}
return negative_num_sensitive;
}
public static boolean isterminatetoken(final char token) {
set keys = tokens.keyset();
return keys.contains(token);
}
public static int gettokenid(final char token) {
return tokens.get(token) == null ? -1 : tokens.get(token);
}
public static int gettokensize() {
return tokens.size();
}
}
enum calculate_mode {
instance;
private static char[][] rules = {
// + - * / ( ) #
{ '>', '>', '', '>' }, // +
{ '>', '>', '', '>' }, // -
{ '>', '>', '>', '>', '', '>' }, // *
{ '>', '>', '>', '>', '', '>' }, // /
{ '
{ '>', '>', '>', '>', 'o', '>', '>' }, // )
{ '
};
static {
if (rules.length != terminate_tokens.gettokensize() || rules.length < 1
|| rules[0].length != terminate_tokens.gettokensize()) {
throw new illegalargumentexception("rules matrix is incorrect!");
}
}
public static char getrule(final char currentoperator, final char opstacktop) {
try {
return rules[terminate_tokens.gettokenid(opstacktop)][terminate_tokens
.gettokenid(currentoperator)];
} catch (throwable e) {
throw new runtimeexception("no rules were defined for some token!");
}
}
}
enum tokenizer {
instance;
private static final stringbuilder buffer = new stringbuilder();
private static string clearexpression(string expression) {
return expression.replaceall(" ", "");
}
private static character previous_char;
private static void clean() {
buffer.delete(0, buffer.length());
previous_char = null;
}
private static boolean processnegativenumbers(final string exp,
final int index) {
char c = exp.charat(index);
if (('+' == c || '-' == c)
&& (previous_char == null || terminate_tokens
.getnegativenumsensitivetoken().contains(previous_char))
&& !terminate_tokens.isterminatetoken(exp.charat(index + 1))) {
buffer.append(c);
return true;
}
return false;
}
@suppresswarnings({ "unchecked", "rawtypes" })
public static list> exec(final string expression) {
clean();
string exp = clearexpression(expression);
list result = new linkedlist();
for (int i = 0; i < exp.length(); i++) {
char c = exp.charat(i);
if (terminate_tokens.isterminatetoken(c)) {
if (processnegativenumbers(exp, i))
continue;
if (buffer.length() > 0) {
result.add(double.valueof(buffer.tostring()));
buffer.delete(0, buffer.length());
}
result.add(c);
} else {
buffer.append(c);
}
previous_char = c;
}
return collections.unmodifiablelist(result);
}
}
输出
4+(3*(3-1)+2)/2 = 8.0
4 + (-3 * ( 3 - 1 ) + 2) = 0.0
4.5+(3.2+3)/2 = 7.6
-4.5+(3.2-3)/2 = -4.4
incorret expression: 4 +-/ (-3 * ( 3 - 1 ) + 2)
error: null
incorret expression: 4.5+(3.2:3)/2
error: for input string: "3.2:3"
总结
以上就是本文关于java实现四则混合运算代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:大话java混合运算规则 浅谈java变量赋值运算符及相关实例 java大数字运算之biginteger等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对萬仟网网站的支持。
希望与广大网友互动??
点此进行留言吧!
java 四则混合运算_Java实现四则混合运算代码示例相关推荐
- java valueof的用法_Java SignStyle valueOf()用法及代码示例
SignStyle枚举的valueOf()方法用于返回具有指定名称的SignStyle类型的枚举. 用法: public static SignStyle valueOf(String name) 参 ...
- java scanner怎么用_Java Scanner delimiter()用法及代码示例
java.util.Scanner类的delimiter()方法返回此Scanner当前用于匹配定界符的Pattern. 用法: public Pattern delimiter() 返回值:该函数返 ...
- java reader类 实例_Java Reader ready()用法及代码示例
Java中Reader类的ready()方法用于检查此Reader是否已准备好被读取.它返回一个布尔值,该值指示阅读器是否准备就绪. 用法: public void ready() 参数:此方法不接受 ...
- java 二维高斯_Java Random nextGaussian()用法及代码示例
随机类的nextGaussian()方法返回下一个伪随机数,即与随机数生成器序列的平均值为0.0,标准差为1.0的高斯(正态)分布双精度值. 用法: public double nextGaussia ...
- minimum在java中的意思_Java Calendar getMinimum()用法及代码示例
Calendar类中的getMinimum(int calndr_field)方法用于返回此Calendar实例的给定日历字段(int calndr_field)的最小值. 用法: public ab ...
- java中attribute用法_Java FieldPosition getFieldAttribute()用法及代码示例
java.text.FieldPosition类的getFieldAttribute()方法用于获取Format.field形式的字段标识符. 用法: public Format.Field getF ...
- java中multiply用法_Java BigInteger multiply()用法及代码示例
java.math.BigInteger.multiply(BigInteger val)用于计算两个BigInteger的乘法.由于BigInteger类内部使用整数数组进行处理,因此对BigInt ...
- java pattern详解_Java Pattern pattern()用法及代码示例
Java中Pattern类的pattern()方法用于获取正则表达式,将其编译以创建此模式.我们使用正则表达式创建模式,并且使用此方法来获取相同的源表达式. 用法: public String pat ...
- java使用abs函数_Java Math abs()用法及代码示例
java.lang.Math.abs()返回给定参数的绝对值. 如果参数不为负,则返回参数. 如果参数为负,则返回参数的取反. 用法: public static DataType abs(DataT ...
- java addall的用法_Java Collections addAll()用法及代码示例
java.util.Collections类的addAll()方法用于将所有指定的元素添加到指定的集合中.要添加的元素可以单独指定或作为数组指定.此便捷方法的行为与c.addAll(Arrays.as ...
最新文章
- 图灵十一月书讯 ——爱在深秋
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别--转
- Apache Flink 在京东的实践与优化
- OpenBSD4.6 FAQ[一]
- 内部类的小总结(语法和用法方面)
- 矩池云上安装chumpy失败
- 基于发起源判断CSRF***的方法
- python怎么读取csv文件-python3读取csv文件任意行列代码实例
- 太阳当空照-Windows服务化方式NSSM指令清单
- 解决 谷歌chrome浏览器开启麦克风
- MyBatisPuls入门案例
- 实在抵不住张老师的诱惑,又跳坑了
- vscode eslint beautify 格式化 html
- 真杜比全景声家庭影院级投影设备,当贝做到了五千元内也支持
- 20189220 余超《Linux内核原理与分析》第三周作业
- 【C语言】如何去求最大公约数和最小公倍数?
- php的bs_PHP能否做BS架构的开发?
- c#如何wmf图片转换成png图片_C# 批量转换图片格式 支持/JPG/TIF/PNG/WMF/GIF等
- [洛谷]P2525 Uim的情人节礼物·其之壱
- 真实可行的android 基站定位代码
热门文章
- 内容平台的勾陈一:做好三件事,驶向星辰大海
- 游戏用计算机配置表显卡,2021锐龙5600X配RTX2060游戏电脑配置搭配建议及配置单推荐...
- 如何让word左侧出现导航栏
- yum 安装mysql 5.7
- 计算机考研856学校,18届北京科技大学856环境学姐,目前已录取,分享一下考研经...
- 计算机怎么关闭u盘系统还原,u盘有写保护怎么解除?如何关闭u盘写的保护?
- 研发出了生产事故,到底要罚钱不?
- 获取屏幕大小 android,Android获取屏幕大小
- 【Kubernetes】 Service Mesh详解
- Android Studio主题设置