String字符串包含运算符实现运算
string aa = "(1+2)/3+(3+4)*5";
DataTable dt = new DataTable();
string b = dt.Compute(aa, "").ToString();
Response.Write(b);
扩展:C#中DataTable中的Compute方法使用收集
java算法1:尚未验证
import java.util.HashMap;
import java.util.Map; public abstract class Operator { /**
* 运算符
*/
private char operator; /**
* 运算符的优先级别,数字越大,优先级别越高
*/
private int priority; private static Map<Character, Operator> operators = new HashMap<Character, Operator>(); private Operator(char operator, int priority) {
setOperator(operator);
setPriority(priority);
register(this);
} private void register(Operator operator) {
operators.put(operator.getOperator(), operator);
} /**
* 加法运算
*/
public final static Operator ADITION = new Operator('+', 100) {
public double eval(double left, double right) {
return left + right;
}
}; /**
* 减法运算
*/
public final static Operator SUBTRATION = new Operator('-', 100) {
public double eval(double left, double right) {
return left - right;
}
}; /**
* 乘法运算
*/
public final static Operator MULTIPLICATION = new Operator('*', 200) {
public double eval(double left, double right) {
return left * right;
}
}; /**
* 除法运算
*/
public final static Operator DIVITION = new Operator('/', 200) {
public double eval(double left, double right) {
return left / right;
}
}; /**
* 冪运算
*/
public final static Operator EXPONENT = new Operator('^', 300) {
public double eval(double left, double right) {
return Math.pow(left, right);
}
}; /**
* 取模运算
*/
public final static Operator MOD = new Operator('%', 200) {
public double eval(double left, double right) {
return left % right;
}
}; public char getOperator() {
return operator;
}
private void setOperator(char operator) {
this.operator = operator;
}
public int getPriority() {
return priority;
}
private void setPriority(int priority) {
this.priority = priority;
} /**
* 根据某个运算符获得该运算符的优先级别
* @param c
* @return 运算符的优先级别
*/
public static int getPrority(char c) {
Operator op = operators.get(c);
if(op != null) {
return op.getPriority();
}
return 0;
} /**
* 工具方法,判断某个字符是否是运算符
* @param c
* @return 是运算符返回 true,否则返回 false
*/
public static boolean isOperator(char c) {
return getInstance(c) != null;
}
public static boolean isOperator(String str) {
if(str.length() > 1) {
return false;
}
return isOperator(str.charAt(0));
} /**
* 根据运算符获得 Operator 实例
* @param c
* @return 从注册中的 Operator 返回实例,尚未注册返回 null
*/
public static Operator getInstance(char c) {
return operators.get(c);
}
public static Operator getInstance(String str) {
if(str.length() > 1) {
return null;
}
return getInstance(str.charAt(0));
} /**
* 根据操作数进行计算
* @param left 左操作数
* @param right 右操作数
* @return 计算结果
*/
public abstract double eval(double left, double right);
}
java算法2:尚未验证
public class Test {
public static void main(String[] args) {
String str = "40944.0501-3.2*100";
Calculator cal = new Calculator();
double d = cal.eval(str);
System.out.println(d);
}
}
public interface MathSymbol {
/**
* 左括号
*/
public final static char LEFT_BRACKET = '(';
/**
* 右括号
*/
public final static char RIGHT_BRACKET = ')';
/**
* 中缀表达式中的空格,需要要忽略
*/
public final static char BLANK = ' ';
/**
* 小数点符号
*/
public final static char DECIMAL_POINT = '.';
/**
* 负号
*/
public final static char NEGATIVE_SIGN = '-';
/**
* 正号
*/
public final static char POSITIVE_SIGN = '+';
/**
* 后缀表达式的各段的分隔符
*/
public final static char SEPARATOR = ' ';
}
import java.util.Stack;
public class Calculator implements MathSymbol {
/**
* 计算中缀表达式
* @param expression
* @return
*/
public double eval(String expression) {
String str = infix2Suffix(expression);
//System.out.println(" Infix Expression: " + expression);
//System.out.println("Suffix Expression: " + str);
if(str == null) {
throw new IllegalArgumentException("Expression is null!");
}
String[] strs = str.split("\\s+");
Stack<String> stack = new Stack<String>();
for(int i = 0; i < strs.length; i++) {
if(!Operator.isOperator(strs[i])) {
stack.push(strs[i]);
} else {
Operator op = Operator.getInstance(strs[i]);
double right = Double.parseDouble(stack.pop());
double left = Double.parseDouble(stack.pop());
double result = op.eval(left, right);
stack.push(String.valueOf(result));
}
}
return Double.parseDouble(stack.pop());
}
/**
* 将中缀表达式转换为后缀表达式
* @param expression
* @return
*/
public String infix2Suffix(String expression) {
if(expression == null) {
return null;
}
char[] chs = expression.toCharArray();
Stack<Character> stack = new Stack<Character>();
StringBuilder sb = new StringBuilder(chs.length);
boolean appendSeparator = false;
boolean sign = true;
for(int i = 0; i < chs.length; i++) {
char c = chs[i];
if(c == BLANK) {
continue;
}
// Next line is used output stack information.
// System.out.printf("%-20s %s%n", stack, sb.toString());
if(appendSeparator) {
sb.append(SEPARATOR);
appendSeparator = false;
}
if(isSign(c) && sign) {
sb.append(c);
continue;
}
if(isNumber(c)) {
sign = false;
sb.append(c);
continue;
}
if(isLeftBracket(c)) {
stack.push(c);
continue;
}
if(isRightBracket(c)) {
sign = false;
while(stack.peek() != LEFT_BRACKET) {
sb.append(SEPARATOR);
sb.append(stack.pop());
}
stack.pop();
continue;
}
appendSeparator = true;
if(Operator.isOperator(c)) {
sign = true;
if(stack.isEmpty() || stack.peek() == LEFT_BRACKET) {
stack.push(c);
continue;
}
int precedence = Operator.getPrority(c);
while(!stack.isEmpty() && Operator.getPrority(stack.peek()) >= precedence) {
sb.append(SEPARATOR);
sb.append(stack.pop());
}
stack.push(c);
}
}
while(!stack.isEmpty()) {
sb.append(SEPARATOR);
sb.append(stack.pop());
}
return sb.toString();
}
/**
* 判断某个字符是否是正号或者负号
* @param c
* @return
*/
private boolean isSign(char c) {
if(c == NEGATIVE_SIGN || c == POSITIVE_SIGN) {
return true;
}
return false;
}
/**
* 判断某个字符是否为数字或者小数点
* @param c
* @return
*/
private boolean isNumber(char c) {
if((c >= '0' && c <= '9') || c == DECIMAL_POINT) {
return true;
}
return false;
}
/**
* 判断某个字符是否为左括号
* @param c
* @return
*/
private boolean isLeftBracket(char c) {
return c == LEFT_BRACKET;
}
/**
* 判断某个字符是否为右括号
* @param c
* @return
*/
private boolean isRightBracket(char c) {
return c == RIGHT_BRACKET;
}
}
String字符串包含运算符实现运算的更多相关文章
- Java常用API——String字符串运算
一.字符串运算 String类 1.概述 String是特殊的引用数据类型,它是final类. 2.构造方法 String str = "abc"; 相当于: char date ...
- Java基础-字符串连接运算符String link operator
Java基础-字符串连接运算符String link operator 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 字符串链接运算符是通过“+”进行拼接的. 一.使用“+”进行字 ...
- String 字符串基本使用
目录 一.JavaDoc解释 二.基础属性和构造函数 三.基本方法说明 一.JavaDoc解释 String类表示字符串,所有Java程序中的字符串像是"abc"都是此类的实例,字 ...
- shell 字符串包含
转自:Shell判断字符串包含关系的几种方法 现在每次分析网站日志的时候都需要判断百度蜘蛛是不是真实的蜘蛛,nslookup之后需要判断结果中是否包含"baidu"字符串 以下给出 ...
- C# 基础运算符及运算
本节主要讲述运算符的分类及其实际运用 运算符 分类 符号 解释 优先级 算数 ++ -- 加加(加1) 减减(减1) 由高到低,即执行顺序由上到下(圆括号的优先级最高) * / % 乘 除 ...
- C# String字符串
C#(静态String类) C#中提供了比较全面的字符串处理方法,很多函数都进行了封装为我们的编程工作提供了很大的便利.System.String是最常用的字符串操作类,可以帮助开发者完成绝大部分的字 ...
- 【前端】javascript判断undefined、null、NaN;字符串包含等
JS中判断null.undefined与NaN的方法 这篇文章主要介绍了JS中判断null.undefined与NaN的方法,需要的朋友可以参考下 . . 写了个 str ="s" ...
- Java String 字符串操作小结
// 转载加编辑 -- 21 Apr 2014 1. Java字符串中子串的查找 Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现 ...
- String字符串相加的原理
因为String是非常常用的类, jvm对其进行了优化, jdk7之前jvm维护了很多的字符串常量在方法去的常量池中, jdk后常量池迁移到了堆中 方法区是一个运行时JVM管理的内存区域,是一个线程共 ...
随机推荐
- phalcon: 官方多模块
目录结构如下 public/index.php: use Phalcon\Mvc\Router; use Phalcon\Tag; use Phalcon\Mvc\Url; use Phalcon\M ...
- VB6 GDI+ 入门教程[4] 文字绘制
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[4] 文字绘制 2009 年 6 月 18 日 7条评论 ...
- 向html中添加节点
简单: ①,js中: (function () { var box=document.querySelector("#box"); var con1=document.create ...
- css选择符有哪些?哪些属性可以继承?优先级算法如何计算?内联和important哪个优先
通配选择符* { sRules } 类型选择符E { sRules } td { font-size:14px; width:120px; } 属性选择符 E [ attr ] { sRule ...
- 老生常谈的Hibernate二级缓存
理解缓存的定义: 缓存(Cache): 计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运 ...
- python知识总结
LIST:Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素,用[]包裹.例如 classmates = ['Michael', 'Bob', 'T ...
- hdu-----(1150)Machine Schedule(最小覆盖点)
Machine Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- IDOC创建、发送、接收及程序代码[转]
什么是IDOC,以及IDOC的步骤 创建IDOC: 第一步:WE31 创建IDOC所包含的字段. 第二步:WE30 创建IDOC 把Segment分配给IDOC 第三步:WE81 创 ...
- 5月21日 CSS样式表加阴影
HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- 关于C#迭代器
>1 IEnumerator与IEnumerable IEnumerator与IEnumerable两个接口是用于实现迭代器的接品只要实现了IEnumerable就可以用foreach,linq ...