`
ethen
  • 浏览: 122220 次
  • 性别: 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 被用来编写数学表达式计算程序,展示了其在软件开发中的灵活性。 2. 知识点:课程设计 该项目作为课程设计的一部分,旨在让学生应用所学的 Java 语言知识,通过实践提高编程技能和问题解决能力...

    Java数学表达式计算(Expression Evaluator)

    总结来说,"Java数学表达式计算"涉及到如何在Java环境中解析和评估复杂的数学表达式。这可以通过使用Java内置的方法、第三方库如Apache Commons Math,或是自定义解析器实现。通过分析提供的`ExprEvalSample`代码,...

    java实现表达式计算源代码

    接下来,我们来看一个简单的Java实现,这里以"山寨版计算器"为例。这个计算器可能包括以下几个关键类: - `Token`:表示解析出的词法单元,可能包含数字、运算符、括号等。 - `Tokenizer`:词法分析器,用于将输入...

    java实现简易计算器

    以上就是基于Java实现简易计算器的基本思路和关键步骤。实际的代码实现会更具体地涉及语法细节和逻辑处理。如果你已经有一个名为"计算器"的Java源代码文件,你可以通过编译和运行它来体验这个计算器的工作原理。

    表达式计算器(java)

    此外,`java.util.Stack`可以用来实现后缀表达式(也称逆波兰表示法)计算,这是一种简化表达式计算的方法。 该项目可能包含了错误处理机制,以识别并报告多种表达式错误,如语法错误、未定义的变量、除以零等。这...

    使用Java正则表达式实现一个简单的身份证号码验证

    ### 使用Java正则表达式实现一个简单的身份证号码验证 #### 一、背景介绍 身份证号码是中国公民的身份标识,由15位或18位数字组成(早期为15位,后改为18位)。其中,第18位是校验码,可能是数字0~9或者大写字母X。...

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

    总结来说,这个Java实现的简易算术表达式解析类是一个基础但实用的工具,它可以处理简单的数学问题,帮助开发者在不使用现成的解析库的情况下,快速实现对字符串表达式的计算功能。通过学习和理解这个实现,开发者...

    Fel Javael表达式引擎

    Fel Java表达式引擎是一款轻量级且高效的开源表达式计算引擎。它的全称是FastExpressionLanguage,专门设计用于满足不断变化的功能需求和性能需求。Fel的执行方式主要依赖于函数,运算符如加减乘除等被视为Fel函数,...

    java解析表达式JEXL实现办法

    Java解析表达式是一个常见的需求,特别是在需要动态计算或者执行用户输入的简单脚本时。JEXL(Java Expression Language)是Apache Commons项目提供的一种轻量级的表达式语言,它允许我们在Java应用程序中方便地执行...

    后缀表达式计算

    后缀表达式的计算方法不仅适用于简单的算术表达式,还可以扩展到更复杂的表达式,如函数调用、条件判断等。在编译原理、解释器实现、计算器程序等领域都有广泛的应用。通过理解并掌握后缀表达式及其计算方法,能帮助...

    java 计算数学表达式

    总的来说,Java处理数学表达式的方式多样,`jeval`库提供了一种便捷的解决方案,适用于大部分简单的到中等复杂的计算需求。对于更复杂或定制化的需求,可以考虑使用自定义解析器或Java的`ScriptEngine`。理解并熟练...

    java c++表达式求值(带括号和小数点)

    6. **Java实现** 在Java中,我们可以使用`Scanner`类读取输入表达式,`Stack&lt;Double&gt;`存储数字,`Stack&lt;Character&gt;`存储操作符。用循环遍历输入,根据字符类型执行相应的操作。 7. **C++实现** 在C++中,可以使用...

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

    Java简易计算器是一个基于Java编程语言实现的计算工具,它不仅支持基本的四则运算,还具备处理三角函数的能力,并且已经实现了运算的优先级规则。这个项目的核心是将用户输入的中缀表达式(常见的数学表达式形式)...

    中缀转后缀表达式计算实现源码(C++、Java)

    对于Java实现,可以使用`Deque`作为栈,`StringBuilder`作为输出字符串的容器: ```java import java.util.Deque; import java.util.LinkedList; public class InfixToPostfix { public String convert(String ...

    精通lambda表达式: java多核编程

    在Java多核编程中,Lambda表达式常与Stream API结合使用,实现高效的数据并行处理。 1. **Lambda表达式的基本语法** Lambda表达式的语法形式为`(parameters) -&gt; expression`或`(parameters) -&gt; { statements }`。...

    java实现多种计算器功能包含表达式

    在Java编程语言中实现一个多功能计算器,涉及到许多关键知识点,包括但不限于基础的算术运算、字符串解析、表达式求值、异常处理以及用户界面设计。下面将详细阐述这些知识点。 1. **基础算术运算**:计算器的核心...

    Java 图形界面化实现计算数学表达式

    这可能涉及正则表达式用于验证输入格式,或者使用字符串分割和栈数据结构来实现一个简单的解析器,处理运算符优先级和括号。 6. **异常处理**:在处理用户输入时,可能出现非法字符、除数为零、超出浮点数范围等...

    java表达式解析,附加

    1. **Java表达式**: Java表达式是程序中的一部分,用于计算一个值。它可以是简单的变量引用、常量,也可以是复杂的运算组合,如算术、比较、逻辑或三元表达式。 2. **表达式语法**: 在Java中,表达式的语法遵循特定...

    精选_表达式计算_源码打包

    在这个“精选_表达式计算_源码打包”压缩包中,我们可以预见到包含的文件“calculation”很可能是一个关于表达式计算的源代码实现。 首先,让我们详细探讨一下表达式计算。在编程语言中,表达式是能够计算出特定值...

Global site tag (gtag.js) - Google Analytics