public class Test {
 
 public static void main(String[] args) {
 
  SimpleCalculator s=new SimpleCalculator();
 String methord="80*(1+0.5)"; //test
  double d=s.evaluate(methord );
  System.out.println(d);
 }
}
 
 
 
 
import java.util.Scanner;
import java.util.Stack;
public class SimpleCalculator {
 
 
 /**
  * Evaluate an arithmetic expression, and return the result as a double.
  *
  * @param input
  * the expression to evaluate.
  * @return the evaluated result.
  */
 public double evaluate(String input) {
  initialize();
  this.scanner = new Scanner(input);
  this.scanner
    .useDelimiter("\\s+|(?=[.0-9])(?<![.0-9])|(?![.0-9])(?<=[.0-9])|(?![.0-9])(?<![.0-9])");
  Token currentToken = nextToken();
  Token t = null;
  while (null != currentToken) {
   switch (currentToken.getKind()) {
   case NUMBER:
    // Simply push number tokens onto the evaluation stack.
    this.eval.push(currentToken.getValue());
    break;
   case LPAREN:
    // Simply push left parenthesis tokens onto the operator stack.
    this.ops.push(currentToken);
    break;
   case RPAREN:
    // Until a left parenthesis pops off the operator stack, keep
    // poping operators and execute them.
    // If the stack becomes empty without a matching left
    // parenthesis,
    // the expression must have syntax errors.
    for (t = this.ops.pop(); TokenKind.LPAREN != t.getKind(); t = this.ops
      .pop()) {
     if (ops.empty())
      throw new Error("Syntax Error: unmatched parenthesis");
     doOperation(t);
    }
    break;
   default:
    // For binary arithmetic operators, keep poping operators whose
    // binding power
    // is less or equal to the current token's and execute them;
    // after that push
    // the current token onto the operator stack.
    if (!ops.empty()) {
     for (t = this.ops.pop(); currentToken.getKind()
       .getBindingPower() < t.getKind().getBindingPower(); t = this.ops
       .pop()) {
      doOperation(t);
      if (this.ops.empty()) {
       t = null;
       break;
      }
     }
    }
    if (null != t)
     ops.push(t);
    ops.push(currentToken);
    break;
   }
   // reinitialize
   currentToken = nextToken();
  }
  // execute remaining operators on stack
  while (!ops.empty()) {
   t = this.ops.pop();
   doOperation(t);
  }
  // the result is on the top of evaluation stack,
  // pop it off and return the result.
  return this.eval.pop();
 }
 /*
  * Initialize the evaluation and operator stacks.
  */
 private void initialize() {
  if (null == this.eval)
   this.eval = new Stack<Double>();
  if (null == this.ops)
   this.ops = new Stack<Token>();
  this.eval.clear();
  this.ops.clear();
 }
 /*
  * Return the next token from the input expression. The token returned will
  * be associated with its numeric value, if and only if the token is a
  * number.
  */
 private Token nextToken() {
  Token t = null;
  if (this.scanner.hasNextDouble()) {
   t = new Token(TokenKind.NUMBER, this.scanner.nextDouble());
  } else if (this.scanner.hasNext()) {
   String s = this.scanner.next("[-+*/()]");
   if ("+".equals(s)) {
    t = new Token(TokenKind.ADD);
   } else if ("-".equals(s)) {
    t = new Token(TokenKind.SUBTRACT);
   } else if ("*".equals(s)) {
    t = new Token(TokenKind.MULTIPLY);
   } else if ("/".equals(s)) {
    t = new Token(TokenKind.DIVIDE);
   } else if ("(".equals(s)) {
    t = new Token(TokenKind.LPAREN);
   } else if (")".equals(s)) {
    t = new Token(TokenKind.RPAREN);
   }
  }
  return t;
 }
 /*
  * Execute a binary arithmetic operation. Pop the top two values off the
  * evaluation stack, do the operation, and then push the result back onto
  * the evaluation stack.
  */
 private void doOperation(Token t) {
  double y = this.eval.pop();
  double x = this.eval.pop();
  double temp = t.getKind().doOperation(x, y);
  this.eval.push(temp);
 }
 /*
  * Tokenizer for the input expression.
  */
 private Scanner scanner;
 /*
  * Evaluation stack.
  */
 private Stack<Double> eval;
 /*
  * Operator stack, for converting infix expression to postfix expression.
  */
 private Stack<Token> ops;
 public static void main(String[] args) {
  if (args.length < 1) {
   System.err.println("Usage: java SimpleCalculator <expression>");
   System.exit(1);
  }
  SimpleCalculator calc = new SimpleCalculator();
  double result = calc.evaluate(args[0]);
  System.out.println(result);
 }
}
enum TokenKind {
 // operators
 ADD(1) {
  public double doOperation(double x, double y) {
   return x + y;
  }
 },
 SUBTRACT(2) {
  public double doOperation(double x, double y) {
   return x - y;
  }
 },
 MULTIPLY(3) {
  public double doOperation(double x, double y) {
   return x * y;
  }
 },
 DIVIDE(4) {
  public double doOperation(double x, double y) {
   return x / y;
  }
 },
 // punctuation
 LPAREN(0), RPAREN(0),
 // number
 NUMBER(0);
 TokenKind(int bindingPower) {
  this.bindingPower = bindingPower;
 }
 public int getBindingPower() {
  return this.bindingPower;
 }
 public double doOperation(double x, double y) {
  return Double.NaN; // dummy, operation not supported
 }
 private int bindingPower;
}
class Token {
 public Token(TokenKind kind) {
  this(kind, Double.NaN);
 }
 public Token(TokenKind kind, double value) {
  this.kind = kind;
  this.value = value;
 }
 public TokenKind getKind() {
  return this.kind;
 }
 public double getValue() {
  return this.value;
 }
 private TokenKind kind;
 private double value;
}

【JAVA】通过公式字符串表达式计算值,网上的一种方法的更多相关文章

  1. Java:判断字符串是否为数字的五种方法

    Java:判断字符串是否为数字的五种方法 //方法一:用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = str. ...

  2. Java中判断字符串是否为数字的五种方法

    //方法一:用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = str.length();--i>=0;){ ...

  3. Java中判断字符串是否为数字的五种方法 (转)

    推荐使用第二个方法,速度最快. 方法一:用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = str.length( ...

  4. 【工具类】Java中判断字符串是否为数字的五种方法

    1 //方法一:用JAVA自带的函数 2 public static boolean isNumeric(String str){ 3 for (int i = str.length();--i> ...

  5. java中判断字符串是否为数字的三种方法

    以下内容引自  http://www.blogjava.net/Javaphua/archive/2007/06/05/122131.html 1用JAVA自带的函数   public static ...

  6. java判断一个字符串是否是数字的三种方法

    参考https://blog.csdn.net/ld_flex/article/details/7699161 1 用JAVA自带的函数 public static boolean isNumeric ...

  7. [转]java中判断字符串是否为数字的三种方法

    1用JAVA自带的函数public static boolean isNumeric(String str){  for (int i = str.length();--i>=0;){      ...

  8. Java 判断字符串是否为空的四种方法、优缺点与注意事项

    以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s));方法二: ...

  9. String空格删除和java删除字符串最后一个字符的几种方法

    1. String.trim()trim()是去掉首尾空格2.str.replace(" ", ""); 去掉所有空格,包括首尾.中间复制代码 代码如下:Str ...

随机推荐

  1. JS手机浏览器判断(转)

    整理查询一下,js判断手机浏览器的方法 <script type="text/javascript"> /* * 智能机浏览器版本信息:包括微信内置 * */ var ...

  2. Validform 学习笔记---代码练习

    上一节主要梳理了validform的基础知识,针对这些基础知识,编写代码的时候,也整理的部分知识,先记录以便后期温习. 验证部分的css @charset "utf-8"; /* ...

  3. java中常用的工具类(二)

    下面继续分享java中常用的一些工具类,希望给大家带来帮助! 1.FtpUtil           Java   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  4. HDU3434 Sequence Adjustment

    题意:给你含有n个数的序列,每次你可以选一个子序列将上面所有的数字加1或者减1,目标是把所有数字变成相同的,问最少步数,和那个相同的数字有多少种可能. 将原序列转化为差分序列,即a[2] - a[1] ...

  5. Oracle merge

    oracle merge 語法:

  6. [Linux] 取得服务器版本

    1) 登录到服务器执行 lsb_release -a ,即可列出所有版本信息,例如: [root@3.5.5Biz-46 ~]# lsb_release -a LSB Version: 1.3 Dis ...

  7. poj 3264 【线段树】

    此题为入门级线段树 题意:给定Q(1<=Q<=200000)个数A1A2…AQ,多次求任一区间Ai-Aj中最大数和最小数的差 #include<algorithm> #incl ...

  8. JAVA的容器---List,Map,Set (转)

    JAVA的容器---List,Map,Set Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashM ...

  9. hdu 5446 Unknown Treasure Lucas定理+中国剩余定理

    Unknown Treasure Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  10. 7.Android常用第三方支付

    移动支付 用户使用移动的终端完成对所购买商品或者服务的支付功能;分为近场支付(蓝牙支付,刷卡,滴卡),和远程支付(网上支付,短信支付) app支付模块 常见的支付厂商-->常见的支付方式 支付宝 ...