`
ethen
  • 浏览: 119617 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

简单表达式计算 Java实现

阅读更多

闲着没事写了个基于List的简单表达式计算的Java实现,简陋了点。。。

import java.util.List;
import java.util.ArrayList;

public class MyCalc {
	public static void main(String[] args) {
		String expr = "1+3*(5-(4-3))+5";
		List<String> items = parseExpr(expr);
		print("Init",items);
		System.out.println("result:"+calcSubExpr(items));
	}
	
	//caculate every sub expresion
	private static double calcSubExpr(List<String> items){
		print("Current items",items);
		if(items.contains("(")){
			int from=items.indexOf("(");
			int to=items.lastIndexOf(")");
			List<String> subList=items.subList(from+1, to);
			double result=calcSubExpr(subList);
			remove(items,from-1,from+3);
			items.add(from-1, ""+result);
		}	
		doMultiplyAndDivide(items);
		doPlusAndNegate(items);
		return Double.parseDouble(items.remove(0));
	}
	
	//remove item from items[from,to]
	private static void remove(List<String> items, int from, int to) {
		// TODO Auto-generated method stub
		for(int i=from;i<to;i++){
			items.remove(from);
		}
	}
	
	//do plus or Negate 
	private static void doPlusAndNegate(List<String> items) {
		// TODO Auto-generated method stub
		print("Before Plus/Negate",items);
		for (int i = 0; i < items.size(); i++) {
			String item = items.get(i);
			if (item.equals("+") || item.equals("-")) {
				double last = Double.parseDouble(items.remove(i - 1));
				items.remove(i - 1);
				double next = Double.parseDouble(items.remove(i - 1));
				double result = calc(last, next, item);
				items.add(i - 1, "" + result);
				i = i - 1;
			}
		}
		print("After Plus/Negate",items);
	}
	//do muilty or devide
	private static void doMultiplyAndDivide(List<String> items) {
		// TODO Auto-generated method stub
		print("Before Multiply/Divide",items);
		for (int i = 0; i < items.size(); i++) {
			String item = items.get(i);
			if (item.equals("*") || item.equals("/")) {
				double last = Double.parseDouble(items.remove(i - 1));
				items.remove(i - 1);
				double next = Double.parseDouble(items.remove(i - 1));
				double result = calc(last, next, item);
				items.add(i - 1, "" + result);
				i = i - 1;
			}
		}
		print("After Multiply/Divide",items);
	}
	private static double calc(double last, double next, String c) {
		// TODO Auto-generated method stub
		System.out.println("Calc() parameters:" + last + " " + next + " " + c);
		char sign = c.charAt(0);
		switch (sign) {
		case '*':
			return last * next;
		case '/':
			return last / next;
		case '+':
			return last + next;
		case '-':
			return last - next;
		}
		return 0;
	}

	private static List<String> parseExpr(String expr) {
		// TODO Auto-generated method stub
		List<String> items = new ArrayList<String>();
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < expr.length(); i++) {
			char c = expr.charAt(i);
			if (isDelim(c)) {
				items.add(sb.toString());
				items.add(""+c);
				sb = new StringBuilder();
			} else {
				sb.append(c);
			}
			if (i == expr.length()-1)
				items.add(sb.toString());
		}
		return items;
	}

	private static boolean isDelim(char c) {
		if (("+-*/%^=()".indexOf(c) != -1))
			return true;
		return false;
	}
	public static void print(String info,List<String> vecotr) {
		System.out.println("Info:"+info);
		System.out.println("Size:" + vecotr.size());
		System.out.println("Content:" + vecotr);
	}

}

  

分享到:
评论
1 楼 shinestmt 2011-10-29  
恩, 确实提供了一种思路, 而且狠清晰
但是,这样子会不会太耗资源了

相关推荐

    java数学表达式计算程序设计报告

    java写的数学表达式计算程序,报告内含代码,能直接运行。

    java实现简易算术表达式解析类

    实现了算术表达式计算的解析,可计算含有括号(),加减乘除+-*/运算

    java简易计算器(四则运算、三角函数、实现优先级)

    java简易计算器,能够进行四则运算、三角函数运算,已实现优先级。 将中缀表达式转化成后缀表达式(逆波兰表达式) 主要运用了栈、简单的数学知识,java图形界面设计等相关知识

    用Java实现计算器

    用Java实现的简易计算器 Java课程作业 ;三个JTextField显示的分别是:储存的数,计算表达式,计算结果;计算顺序:不论优先级,一律按照从左到右的顺序计算,跟Windows自带的计算器一样;清除键:清除表达式和计算...

    java计算器代码实现简单计算

    java计算器代码简单的计算器java计算器代码实现简单计算

    Fel是轻量级的高效的表达式计算引擎

    Fel的执行主要是通过函数实现,运算符(+、-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单。 Fel有双引擎,同时支持解释执行和编译执行。可以根据性能要求选择执行方式。编译执行就是将表达式...

    JavaSwing实现简单计算器

    利用JavaSwing实现简单的计算器,输入计算表达式得出结果,支持左右括号,负数以及小数。简单处理表达式不正确的情况,并且负数需打上括号。

    Java中缀表达式求值

    此文档中的代码实现了简单的计算中缀表达式的求值方法,通过把中缀表达式转换为后缀表达式,可以很方便的进行求值。

    全国计算机二级java题库

    掌握Java语言的特点,实现机制和体系结构。 2. 掌握Java语言中面向对象的特性。 3. 掌握Java语言提供的数据类型和结构。 4. 掌握Java语言编程的基本技术。 5. 会编写Java用户界面程序。 6. 会编写Java简单应用程序...

    java开源包4

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    Java正则表达式详解

    何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的...

    java计算器源码+文档

    主要思想:1)将中缀表达式转化为后缀表达式 2):根据后缀表达式计算表达式结果 数据结构:堆栈(使用JAVA中util包中Stack类) 列表(使用JAVA中util包中ArrayList类) 界面良好,代码完整可直接运行,文档很好哦!

    Java开发技术大全(500个源代码).

    leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper.java 小写字母转换成大写字母 lozengeStar.java 输出一个由*组成的菱形 multiplyTable.java 求乘法口诀表 narrowingConversion_1.java 缩减转换引发...

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    JAVA上百实例源码以及开源项目源代码

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    java 正则表达式

    JAVA正则表达式语法(转)正则表达式语法正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式示例表达式 ...

    java开源包3

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包101

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包11

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

Global site tag (gtag.js) - Google Analytics