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. Gmail 账号找回办法

    前段时间一直在用GFW代理,结果发现GOOGLE账户的保护机制起用了,要给以前的手机号发消息,结果哪个号现在不用了,所以就登陆不进去了,非常扯淡,索性谷歌了下,得出如下的解决方案,完美解决,下次直接在 ...

  2. 【翻译十八】java-并发之锁对象

    Lock Objects Synchronized code relies on a simple kind of reentrant lock. This kind of lock is easy ...

  3. SQLAlchemy高级ORM之改查删除及GROUP,JOIN...

    按书上案例来的. #coding=utf-8 from datetime import datetime from sqlalchemy import (MetaData, Table, Column ...

  4. IReport问题整理

    1. 问题:IReport如何实现变量字段$F{ propertyName}赋值为一个NULL对象时不显示”null”, 而显示为空白? 解决方法:选中动态单元格,右键选择属性,在弹出对话框TextF ...

  5. oracle 11g r1 RAC增加新节点

    在一套两节点的rac上增加一个新的节点,详细的操作记录如下:   已有节点RAC1,RAC2 一,环境及版本: 公司环境:Vmware Esxi 5.5  操作系统:Redhat 5.8 x86_64 ...

  6. C# 重绘tabControl,添加关闭按钮(续)

    在上一篇随笔中,添加关闭按钮是可以实现 ,但细心一点就会发现,每次关闭一个选项卡,tableControl都会自动跳到第一个页面,显然 这不是我们想要的,为此,我修改了部分的代码.除此之外,我还添加了 ...

  7. hdu 4293 2012成都赛区网络赛 dp ****

    题意:有n个人,可任意分成若干组,然后每个人个各提供一个信息,表示他们组前面有多少人,后面有多少人.问最多有多少个信息是不冲突的. 将n个人看成一组区间,然后每个人的信息可以表示为该人所在组的区间,然 ...

  8. NSFileManager 的基本使用方法

    本方法已有个人总结, int main(int argc, const char * argv[]) { @autoreleasepool { NSString *path=@"/Users ...

  9. indeterminateDrawable

    Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如ok,我们开始吧: 一)变换前背景 先来看看 ...

  10. Java 多字符分割字符串

    有时候要对不规整的数据进行分割处理,数据中可能会出现一个或多个不同的分割符,这时需要用到 String.split() 方法来进行分割,代码如下: String string = "张三:李 ...