使用栈来实现,可以处理运算优先级。

使用自然四则运算表达式即可,如: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实现四则混合运算代码示例相关推荐

  1. java valueof的用法_Java SignStyle valueOf()用法及代码示例

    SignStyle枚举的valueOf()方法用于返回具有指定名称的SignStyle类型的枚举. 用法: public static SignStyle valueOf(String name) 参 ...

  2. java scanner怎么用_Java Scanner delimiter()用法及代码示例

    java.util.Scanner类的delimiter()方法返回此Scanner当前用于匹配定界符的Pattern. 用法: public Pattern delimiter() 返回值:该函数返 ...

  3. java reader类 实例_Java Reader ready()用法及代码示例

    Java中Reader类的ready()方法用于检查此Reader是否已准备好被读取.它返回一个布尔值,该值指示阅读器是否准备就绪. 用法: public void ready() 参数:此方法不接受 ...

  4. java 二维高斯_Java Random nextGaussian()用法及代码示例

    随机类的nextGaussian()方法返回下一个伪随机数,即与随机数生成器序列的平均值为0.0,标准差为1.0的高斯(正态)分布双精度值. 用法: public double nextGaussia ...

  5. minimum在java中的意思_Java Calendar getMinimum()用法及代码示例

    Calendar类中的getMinimum(int calndr_field)方法用于返回此Calendar实例的给定日历字段(int calndr_field)的最小值. 用法: public ab ...

  6. java中attribute用法_Java FieldPosition getFieldAttribute()用法及代码示例

    java.text.FieldPosition类的getFieldAttribute()方法用于获取Format.field形式的字段标识符. 用法: public Format.Field getF ...

  7. java中multiply用法_Java BigInteger multiply()用法及代码示例

    java.math.BigInteger.multiply(BigInteger val)用于计算两个BigInteger的乘法.由于BigInteger类内部使用整数数组进行处理,因此对BigInt ...

  8. java pattern详解_Java Pattern pattern()用法及代码示例

    Java中Pattern类的pattern()方法用于获取正则表达式,将其编译以创建此模式.我们使用正则表达式创建模式,并且使用此方法来获取相同的源表达式. 用法: public String pat ...

  9. java使用abs函数_Java Math abs()用法及代码示例

    java.lang.Math.abs()返回给定参数的绝对值. 如果参数不为负,则返回参数. 如果参数为负,则返回参数的取反. 用法: public static DataType abs(DataT ...

  10. java addall的用法_Java Collections addAll()用法及代码示例

    java.util.Collections类的addAll()方法用于将所有指定的元素添加到指定的集合中.要添加的元素可以单独指定或作为数组指定.此便捷方法的行为与c.addAll(Arrays.as ...

最新文章

  1. 图灵十一月书讯 ——爱在深秋
  2. postman中 form-data、x-www-form-urlencoded、raw、binary的区别--转
  3. Apache Flink 在京东的实践与优化
  4. OpenBSD4.6 FAQ[一]
  5. 内部类的小总结(语法和用法方面)
  6. 矩池云上安装chumpy失败
  7. 基于发起源判断CSRF***的方法
  8. python怎么读取csv文件-python3读取csv文件任意行列代码实例
  9. 太阳当空照-Windows服务化方式NSSM指令清单
  10. 解决 谷歌chrome浏览器开启麦克风
  11. MyBatisPuls入门案例
  12. 实在抵不住张老师的诱惑,又跳坑了
  13. vscode eslint beautify 格式化 html
  14. 真杜比全景声家庭影院级投影设备,当贝做到了五千元内也支持
  15. 20189220 余超《Linux内核原理与分析》第三周作业
  16. 【C语言】如何去求最大公约数和最小公倍数?
  17. php的bs_PHP能否做BS架构的开发?
  18. c#如何wmf图片转换成png图片_C# 批量转换图片格式 支持/JPG/TIF/PNG/WMF/GIF等
  19. [洛谷]P2525 Uim的情人节礼物·其之壱
  20. 真实可行的android 基站定位代码

热门文章

  1. 内容平台的勾陈一:做好三件事,驶向星辰大海
  2. 游戏用计算机配置表显卡,2021锐龙5600X配RTX2060游戏电脑配置搭配建议及配置单推荐...
  3. 如何让word左侧出现导航栏
  4. yum 安装mysql 5.7
  5. 计算机考研856学校,18届北京科技大学856环境学姐,目前已录取,分享一下考研经...
  6. 计算机怎么关闭u盘系统还原,u盘有写保护怎么解除?如何关闭u盘写的保护?
  7. 研发出了生产事故,到底要罚钱不?
  8. 获取屏幕大小 android,Android获取屏幕大小
  9. 【Kubernetes】 Service Mesh详解
  10. Android Studio主题设置