返回顶部
首页 > 资讯 > 精选 >Java实现四则混合运算代码示例
  • 160
分享到

Java实现四则混合运算代码示例

java四则运算ava 2023-05-31 01:05:06 160人浏览 独家记忆
摘要

使用栈来实现,可以处理运算优先级。使用自然四则运算表达式即可,如:4+(3*(3-1)+2)/2。无需把表达式先转换为逆波兰等形式。package com.joshua.cal; import java.util.Collections;

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

使用自然四则运算表达式即可,如: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<Double> numStack = new Stack<Double>();   private final Stack<Character> opStack = new Stack<Character>();   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<Character, Integer> TOKENs = new HashMap<Character, Integer>();   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<Character> NEGATIVE_NUM_SENSITIVE = new HashSet<Character>();   public static synchronized Set<Character> 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<Character> 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' }, // (       { '>', '>', '>', '>', 'o', '>', '>' }, // )       { '<', '<', '<', '<', '<', '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);   } }

--结束END--

本文标题: Java实现四则混合运算代码示例

本文链接: https://lsjlt.com/news/222727.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java实现四则混合运算代码示例
    使用栈来实现,可以处理运算优先级。使用自然四则运算表达式即可,如:4+(3*(3-1)+2)/2。无需把表达式先转换为逆波兰等形式。package com.joshua.cal; import java.util.Collections; ...
    99+
    2023-05-31
    java 四则运算 ava
  • Java混合运算规则的示例分析
    这篇文章主要介绍了Java混合运算规则的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。重要规则://byte short char 做混...
    99+
    2023-05-31
    java
  • Pandas实现聚合运算agg()的示例代码
    目录前言1. 创建DataFrame对象2. 单列聚合3. 多列聚合4. 多种聚合运算5. 多种聚合运算并更改列名6. 不同的列运用不同的聚合函数7. 使用自定义的聚合函数8. 方便...
    99+
    2024-04-02
  • php四则运算怎么实现
    在PHP中,可以使用基本的数学运算符(+,-,*,/)来实现四则运算。以下是一个示例代码,演示了如何实现四则运算:```php```...
    99+
    2023-08-24
    php
  • Java实现大数运算的实例代码
    一、大数运算介绍大数运算,顾名思义,就是很大的数值的数进行一系列的运算。它是指由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算。二、Java...
    99+
    2023-05-31
    java 大数运算 ava
  • php实现四则运算的方法
    这篇文章给大家分享的是有关php实现四则运算的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php实现四则运算的方法:首先创建一个PHP示例文件;然后声明数字栈和符号栈;接着把运算串分解成每个字符到$arr数...
    99+
    2023-06-09
  • shell中怎么实现四则运算
    本篇文章为大家展示了shell中怎么实现四则运算,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.简单方法代码如下:$ b=$((5*5+5-3/2)) $ echo $b29 在linux she...
    99+
    2023-06-09
  • C#怎么实现计算器四则运算
    这篇文章主要讲解了“C#怎么实现计算器四则运算”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么实现计算器四则运算”吧!初始化,实现四则运算using System;using...
    99+
    2023-06-29
  • Java实现Floyd算法的示例代码
    目录一 问题描述二 代码三 实现一 问题描述 求节点0到节点2的最短路径。 二 代码 package graph.floyd; ...
    99+
    2024-04-02
  • Java实现Kruskal算法的示例代码
    目录介绍一、构建后的图二、代码三、测试介绍 构造最小生成树还有一种算法,即 Kruskal 算法:设图 G=(V,E)是无向连通带权图,V={1,2,...n};设最小生成树 T=(...
    99+
    2024-04-02
  • Java实现Dijkstra算法的示例代码
    目录一 问题描述二 实现三 测试一 问题描述 小明为位置1,求他到其他各顶点的距离。 二 实现 package graph.dij...
    99+
    2024-04-02
  • shell实现四则运算简单方法
    1.简单方法 $ b=$((5*5+5-3/2)) $ echo $b29 在linux shell中,我们可以使用 $(()) 将表达式放在括号中,即可达到运算的功能。 2.其它方法: 用:expr...
    99+
    2022-06-04
    简单 方法 shell
  • Go语言如何实现四则运算
    在Go语言中,四则运算是通过基本的算术运算符来实现的。常用的四则运算操作:1、加法(+): 用于将两个数相加;2、减法(-): 用于将第二个数从第一个数中减去;3、乘法(*): 用于将两个数相乘;4、除法(/): 用于将第一个数除以第二个数...
    99+
    2023-12-21
    go语言 四则运算
  • python四则运算表达式求值示例详解
    目录四则运算表达式求值思路说明算法步骤代码四则运算表达式求值 思路说明 使用双栈来实现——存放数值的栈 nums 与存放运算符的栈&nbs...
    99+
    2024-04-02
  • Python实现简单的四则运算计算器
    一、算法 1、算法的主要思想就是将一个中缀表达式(Infix expression)转换成便于处理的后缀表达式(Postfix expression),然后借助于栈这个简单的数据结构,计算出表达式...
    99+
    2022-06-04
    计算器 简单 Python
  • JavaScript实现计算器的四则运算功能
    目录一、需求 + 最终实现1. 需求2. 说明:利用了字符串(split、replace)和数组(splice)的方法。3. 代码实现二、实现步骤1. 版本一:实现基础加减乘除2. ...
    99+
    2024-04-02
  • Java实现雪花算法的示例代码
    一、介绍 SnowFlow算法是Twitter推出的分布式id生成算法,主要核心思想就是利用64bit的long类型的数字作为全局的id。在分布式系统中经常应用到,并且,在id中加入...
    99+
    2024-04-02
  • Java实现抽奖算法的示例代码
    目录一、题目描述二、解题思路三、代码详解四、优化抽奖算法解题思路代码详解一、题目描述 题目: 小虚竹为了给粉丝送福利,决定在参与学习打卡活动的粉丝中抽一位幸运粉丝,送份小礼物。为了公...
    99+
    2024-04-02
  • gojson编译原理XJSON实现四则运算
    目录前言转义字符性能优化实现四则运算总结前言 在上一篇中介绍了xjson的功能特性以及使用查询语法快速方便的获取JSON中的值。 同时这次也更新了一个版本,主要是两个升级: 对转义...
    99+
    2024-04-02
  • Java的位运算实例代码分析
    今天小编给大家分享一下Java的位运算实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。位运算很久以前学习过位运算,...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作