简单四则运算表达式的java实现(2)

  网上看到的一种很给力的实现方法,利用递归。

      /**
       * 思路
       * 1、排除空字符串
       * 2、得到第一个符号的索引
       * 3、假如只存在数字,直接转换并返回
       * 4、假如存在左括号,则找到右括号,并将括号里面的字符串递归计算,并替换,然后整体递归,去掉所有括号
       * 5、先递归分解加减,保证乘除的优先级
       * 6、再递归分解乘除,乘除计算完后会自动的回溯计算加减
       * @param s
       * @return
       * @throws Exception
       */
       public static float opt(String s) throws Exception{
           //1
         if(s == null || "".equals(s.trim())) {
             return 0f;
         }
         //2
         int a1=s.indexOf(‘+‘);
         int a2=s.indexOf(‘-‘);
         int a3=s.indexOf(‘*‘);
         int a4=s.indexOf(‘/‘);
         int a5=s.indexOf(‘(‘);
         //3 计算单独的数字
         if(a1==-1&&a2==-1&&a3==-1&&a4==-1){
             if(s.trim()==null||"".equals(s.trim())){
                 throw new Exception("operate error");
             }
             return Float.parseFloat(s.trim());
         }
          //4先计算括号
         if(a5!=-1){
         int a6=s.lastIndexOf(‘)‘);
             if(a6==-1){
                 throw new Exception("括号不匹配");
             }else{
                 float f=opt(s.substring(a5+1,a6).trim());
                 s=s.replace(s.substring(a5,a6+1), String.valueOf(f));
                 return opt(s);
             }
         }

         //5先按加减拆开,保证乘除的优先级
         if(a1!=-1){
             return opt(s.substring(0,a1))+opt(s.substring(a1+1,s.length()));
         }
         if(a2!=-1){
             return opt(s.substring(0,a2))-opt(s.substring(a2+1,s.length()));
         }
         //6
         if(a3!=-1){
             return opt(s.substring(0,a3))*opt(s.substring(a3+1,s.length()));
         }
         if(a4!=-1){
             return opt(s.substring(0,a4))/opt(s.substring(a4+1,s.length()));
         }
         return Integer.parseInt(s.trim());
     }

  还有一种更便捷的方法,利用内置的JS引擎

        public static Object jsCalculate(String script) {
          ScriptEngineManager manager = new ScriptEngineManager();
          ScriptEngine engine = manager.getEngineByName("javascript");
          try {
            return (Object) engine.eval(script);
          } catch (ScriptException ex) {
            ex.printStackTrace();
          }
          return null;
        }
时间: 2024-11-13 08:34:37

简单四则运算表达式的java实现(2)的相关文章

简单四则运算表达式的java实现

思路: 1  将表达式转换成后缀表达式 2 利用栈计算后缀表达式 /** * 计算数值 * @param text * @return */ public static int count(String text) { Queue<String> queue=changeToPostOrder(text); Stack<Integer> stack=new Stack<>(); int result=0; while(!queue.isEmpty()) { String

java stack实现的中缀简单四则运算表达式计算

public abstract class Stack<T> { public abstract boolean isEmpty(); public abstract boolean isFull(); public abstract T top(); public abstract boolean push(T x); public abstract T pop(); public abstract void clear(); } public class SeqStack<T>

简单四则运算

问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 3.1.表达式只含 +, -, *, / 四则运算符,不含括号 3.2.表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 3.3.要考虑加减乘除按通常四则运算规定的计算优先级 3.4.除法用整数除法,即仅保留除法运算结果的整数部分.比如8/3=2.输入表达式保证无0作为除数情况发生 3.5.输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现

华为机考--简单四则运算

问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 1.表达式只含 +, -, *, / 四则运算符,不含括号 2.表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 3.要考虑加减乘除按通常四则运算规定的计算优先级 4.除法用整数除法,即仅保留除法运算结果的整数部分.比如8/3=2.输入表达式保证无0作为除数情况发生 5.输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况 要求实

Java实验项目二——小学生考试系统(简单四则运算)

Program:设计实现一个小学生数学考试系统,完成随机出题(简单的四则运算),学生答题,自动判分的功能. Description:代码如下: 1 /* 2 * Description:面向考试系统建立类TestSystem 3 * 4 * */ 5 6 package entity; 7 8 public class TestSystem { 9 10 private int num1; //声明两个操作数 11 private int num2; 12 private String oper

Java四则运算表达式求解

压栈思想计算Java运算表达式 栈的规则是先进后出.利用压栈的思想来计算四则运算表达式是这样的:我们给定两个栈,一个用来存放数字.一个用来存放对应的操作符.假定我们有一个给定的四则运算表达式a+b+c/d*(e+f)-d*a,那我们先把这个表达式拆分成一个个的数字或者是运算符.或者就是括号了.然后我们从左至右遍历每一个元素,遍历过程中遵循步骤和原则如下: (1)遇到数字则直接压到数字栈顶. (2)遇到运算符(+-*/)时,若操作符栈为空,则直接放到操作符栈顶,否则,见(3). (3)若操作符栈顶

计算四则运算表达式(Java语言实现)

计算四则运算表达式主要是分两步运算  第一步是把 中缀表达式 转换成 后缀表达式.参考大一下期学的 <数据结构与算法分析--C语言描述>3.3.3 教材,完成下列代码: static String mid_to_suf(String str){ Stack<Character> s = new Stack<Character>(); String suf = new String(); HashMap<Character, Integer> map = ne

结对项目--四则运算生成器(Java) 刘彦享+龙俊健

结对项目--四则运算生成器(Java) GitHub地址 合作者 刘彦享(3118005010) 龙俊健(3118005011) https://github.com/LYX708194/calculate 一.项目简介 说明 自然数:0, 1, 2, -. 真分数:1/2, 1/3, 2/3, 1/4, 1'1/2, -. 运算符:+, ?, ×, ÷. 括号:(, ). 等号:=. 分隔符:空格(用于四则运算符和等号前后). 算术表达式: e = n | e1 + e2 | e1 ? e2

2nd 简单四则运算更新

简单四则运算更新 功能:由随机数决定出题为10个以内的数字,并确定是否出现括号(仅限一对),顺序输出表达式,并用栈的方式进行计算,判断正误.其他功能有待进一步实现. 头文件 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <math.h> 栈的结构体 typedef struct stack { double * e; in