`
leichenlei
  • 浏览: 128176 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

简单的表达式、公式解析器

 
阅读更多

最近在做新项目,需要计算预先配置的表达式的结果。

表达式特点:

1,浮点类型

2,代变量参数

3,只限于简单计算符号

表达式类似于:"3*(4+a)/6"

程序:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
 * 
 * @author chenlei
 * @2013-1-16
 */
public class Formula {
	/**
	 * 类型
	 */
	private final static int NUMBER = 1;
	private final static int OPERATOR = 2;
	private final static int END_PAREN = 3;
	private final static int START_PAREN = 4;
	/**
	 * 操作符优先级
	 */
	private static Map<Character, Integer> priority;
	static{
		priority = new HashMap<Character, Integer>(4);
		priority.put('-', 1);
		priority.put('+', 1);
		priority.put('*', 2);
		priority.put('/', 2);
	}
	/**
	 * 后缀表达式
	 */
	public List<String> postfix = new ArrayList<String>();
	/**
	 * 构造
	 * @param formula 公式
	 */
	public Formula(String formula){
		formula = formula.toLowerCase();
		LinkedList<Character> stack = new LinkedList<Character>();
		int type = 0;
		StringBuffer str= new StringBuffer();
		for(int i = 0; i < formula.length(); i++){
			char c = formula.charAt(i);
			if(c >= 48 && c <= 57  || c >= 97 && c <= 122 || c == 46){
				type = NUMBER;
				str.append(c);
			}else{
				if(str.length() != 0){
					postfix.add(str.toString());
					str.setLength(0);
				}
				switch(c){
					case '+':
					case '-':
					case '*':
					case '/':
						if(type == 0 || type == OPERATOR || type == START_PAREN){
							throw new RuntimeException("format error !");
						}
						type = OPERATOR;
						operator(stack, c);
					break;
					case '(':
						type = START_PAREN;
						stack.push(c);
					break;
					case ')':
						if(type == OPERATOR){
							throw new RuntimeException("format error !");
						}
						type = END_PAREN;
						endParen(stack);
					break;
				}
			}
		}
		if(str.length() != 0){
			postfix.add(str.toString());
		}
		while(!stack.isEmpty()){
			char operator = stack.pop();
			if(operator == '('){
				throw new RuntimeException("paren not paired !");
			}
			postfix.add(operator + "");
		}
	}
	/**
	 * 公式结果
	 * @param variable 公式变量
	 * @return 结果
	 */
	public double getResult(double... variable){
		LinkedList<Double> stack = new LinkedList<Double>();
		int varIndex = 0;
		for(String element : postfix){
			char c = element.charAt(0);
			if(c >= 48 && c <= 57 || c == 46){
				stack.push(Double.parseDouble(element));
			}else if(c >= 97 && c <= 122){
				stack.push(variable[varIndex]);
				varIndex++;
			}else{
				double num2 = stack.pop();
				double num1 = stack.pop();
				double num;
				switch(c){
					case '+':
						num = num1 + num2;
					break;
					case '-':
						num = num1 - num2;
					break;
					case '*':
						num = num1 * num2;
					break;
					case '/':
						num = num1 / num2;
					break;
					default:
						num = 0;
				}
				stack.push(num);
			}
		}
		if(stack.size() == 0){
			return 0;
		}else{
			return stack.pop();
		}
	}
	/**
	 * 处理操作符
	 * @param operator 操作符
	 */
	private void operator(LinkedList<Character> stack, char operator){
		int prior = priority.get(operator);
		while(!stack.isEmpty()){
			char thisOperater = stack.pop();
			if(thisOperater == '('){
				stack.push(thisOperater);
				break;
			}else{
				int thisPrior = priority.get(thisOperater);
				if(thisPrior < prior){
					stack.push(thisOperater);
					break;
				}else{
					postfix.add(thisOperater + "");
				}
			}
		}
		stack.push(operator);
	}
	/**
	 * 处理结束括号
	 */
	private void endParen(LinkedList<Character> stack){
		boolean startParen = false;
		while(!stack.isEmpty()){
			char element = stack.pop();
			if(element == '('){
				startParen = true;
				break;
			}else{
				postfix.add(element + "");
			}
		}
		if(startParen == false){
			throw new RuntimeException("paren not paired !");
		}
	}
	public static void main(String[] args) {
		Formula formula = new Formula("3*(4+a)/6");
		System.out.println(formula.getResult(5));
	}
}

 

参考了java数据结构和算法 第二版。但,加入了错误处理、变量等。

分享到:
评论

相关推荐

    delphi 教你如何做表达式解析器

    在IT领域,构建一个表达式解析器是一项基础且重要的任务,尤其对于编程语言的设计与实现。本教程将通过Delphi这一强大的Object Pascal开发环境,教你如何构建一个表达式解析器,涉及词法分析器和语法分析器的关键...

    C# 表达式解析器源代码(修正)

    在本文中,我们将深入探讨C#中的表达式解析器,特别是在修正了算符优先级错误之后的实现。C#表达式解析器是一个程序,它能够分析输入的字符串表达式,并将其转换为计算机可以理解的形式,以便执行计算或逻辑操作。 ...

    表达式解析器源代码(可以计算各种函数).zip

    《深入解析表达式解析器:计算各种函数的源代码实现》 在计算机科学领域,表达式解析器是一种至关重要的工具,它能够理解并处理各种数学和逻辑表达式,执行计算并返回结果。这个名为"表达式解析器源代码(可以计算...

    C#表达式解析器-1.0

    - **动态计算**:在金融、科学计算等领域,用户可能需要动态输入计算公式,解析器可以实时解析并执行这些公式。 - **脚本系统**:游戏开发中,常常需要实现基于玩家行为的脚本系统,表达式解析器能解析玩家输入的...

    四则运算表达式解析器源码(C#)

    标题中的“四则运算表达式解析器源码(C#)”是指一个使用C#编程语言编写的程序,它的主要功能是解析包含加法(+)、减法(-)、乘法(*)、除法(/)、取模(%)以及比较运算符(&lt;、&gt;、=、、、&gt;=)的数学表达式。...

    易语言表达式计算公式解析

    表达式计算公式解析的核心在于解析器,这个解析器会将用户输入的字符串形式的表达式转化为可执行的代码结构。在易语言中,这个过程通常包括词法分析和语法分析两个阶段。词法分析将输入的表达式分解为一系列的词法...

    数学公式解析器

    在IT领域,数学公式解析器是一种至关重要的工具,它能够将人类可读的数学表达式转换为计算机可以理解和执行的形式。本项目提供的数学公式解析器包含源码,允许开发者将其集成到自己的系统中,极大地拓展了软件的功能...

    c++数学表达式解析

    在C++编程中,实现一个数学表达式解析器是一项常见的任务,它允许程序处理和求解用户输入的数学表达式。本项目旨在提供一个简单易懂的C++计算器实现,支持括号和基本的四则运算(加、减、乘、除)。通过使用波兰...

    【转】表达式解析器

    在本文中,我们将深入探讨“表达式解析器”的概念,特别是在C++环境下如何实现一个能够处理四则运算、三角函数、开方以及幂运算的解析器。表达式解析器是编程语言理论的一个重要组成部分,它负责将人类可读的数学或...

    java 公式解析源码

    在提供的压缩包中,`test`目录可能包含单元测试,用于验证公式解析器的正确性。这些测试用例通常包括各种复杂性和边界条件的公式,以确保解析器能正确处理各种情况。 `src`目录则是源代码所在的地方,我们可以在...

    开源表达式解析器开源表达式解析器开源表达式解析器

    IKExpression作为一个专注于简单性和易用性的开源表达式解析器,适用于需要快速部署且对性能有一定要求的应用场景。通过持续的技术迭代和功能完善,IKExpression已经成为一个可靠的选择,特别是在那些需要用户友好...

    C# 表达式解析器源代码

    本项目"**C# 表达式解析器源代码**"提供了一个用C#实现的简单表达式解析器,特别强调了对算术运算符的优先级处理、括号的正确识别以及函数的支持。这个解析器对于理解编译原理、开发计算引擎或进行动态计算等场景...

    易语言表达式计算公式解析源码

    在易语言中,你可以使用内置的“表达式”函数来解析和计算简单的表达式,但如果你想处理更复杂的表达式或者自定义运算符,就需要编写自己的解析器。这可能涉及到对易语言的内部机制有深入的理解,包括其语法结构、...

    VC实现的数学公式解析器源码

    在计算机科学领域,数学公式解析器是一种至关重要的工具,它能够理解并处理数学表达式,将人类可读的公式转化为机器可执行的指令。本文将深入探讨一个由VC(Visual C++)实现的数学公式解析器项目,该项目基于MFC...

    Java编程艺术-表达式解析器.rar

    在给定的“Java编程艺术-表达式解析器.rar”压缩包文件中,我们可以深入学习如何在Java中构建这样一个工具,以执行类似"(100 – 5) * 14/6"的算术运算公式。 首先,理解表达式解析器的概念至关重要。解析器是编译器...

    Delphi简易公式解析器代码.rar

    本资源“Delphi简易公式解析器代码.rar”提供了一个用Delphi编写的简单公式解析器的源代码,这对于理解编译原理、表达式解析以及算法实现等方面的知识具有很高的学习价值。 公式解析器是编程中的一个重要工具,它能...

    IKExpression1.0简易表达式解析器

    一个适用于 OA工作流系统的简单的公式解析器。 用于工作流中的简单逻辑判断,非常易用。 也可用在二次开发中,让最终用户可以简单的配置工作流的条件 详细请查阅 http://linliangyi2007.javaeye.com/blog/299897

    易语言表达式计算公式解析源码.7z

    这个"易语言表达式计算公式解析源码.7z"压缩包文件包含的源码,很显然与易语言中处理数学表达式计算和公式解析相关。下面将详细讨论易语言中的表达式计算和公式解析相关知识点。 1. **易语言的基本概念**: - **...

    基于MFC的简易计算器(表达式解析)

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来构建一个简易的计算器,特别是关注表达式的解析和求值。MFC 是微软为 Windows 平台开发 C++ 应用程序提供的一套类库,它简化了Windows API ...

Global site tag (gtag.js) - Google Analytics