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

表达式计算

 
阅读更多
中缀表达式转后缀
后缀表达式计算
支持整型 分数计算,只支持 + - * /
package org.jf.alg.stack;

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

public class OperationUtil 
{

	/**
	 * 中缀表达式转为后缀表达式
	 * (1)获取下一个输入标记
	 * (2)如果标记是:
	 * 左括号:将其压入表达式栈
	 * 右括号:连续弹出并显示栈中的元素,直到遇到一个左括号
	 * 一个运算符:如果栈为空,或者标记具有比栈顶元素更高的优先级,则将其压入栈中,否则弹出并显示
	 *           栈顶元素;接着继续比较标记和新的栈顶元素
	 * 一个操作数:显示它
	 * (3)当到到中缀表达式结尾时,弹出并显示栈中的元素直到栈空
	 * @param middleFixString
	 * @param fraction
	 * @return
	 */
	public static List<String> toPostfixExp(String middleFixString,boolean fraction)
	{
		
		Stack<String> opSt = new Stack<String>();
		List<String> postExpList = new ArrayList<String>();
		List<String> eleList = getElementList(middleFixString,fraction);
		for(String ele:eleList)
		{
			char c = ele.charAt(0);
			if(ele.length()==1 && !(c>='0' && c<='9'))
			{
				switch(c)
				{
				case '(' :
					opSt.push(ele);
					break ;
				case ')' :
					for(;;)
					{
						if(opSt.isEmpty())
							break;
						String op = opSt.pop();
						if(op .equals("("))
							break;
							postExpList.add(op);
						
					}
					break ;
				default:
			
					if(opSt.isEmpty())
						opSt.push(ele);
					else
					{//比较优先级
						while(!opSt.isEmpty())
						{
							char opTop = opSt.peek().charAt(0);
							if(opSt.isEmpty()||opTop == '(')
							{
								opSt.push(ele);
								break;
							}
							
							if(getPriority(c)>getPriority(opTop))
							{
								opSt.push(ele);
								break;
							}
							else
							{
								postExpList.add(opSt.pop());
							}
						}
						
						if(opSt.isEmpty())
							opSt.push(ele);
					}
				}
			}
			else
			{
				postExpList.add(ele);
			}
		}
		
		while(!opSt.isEmpty())
		{
			postExpList.add(opSt.pop());
		}
		return postExpList;
	}
	
	
	

	private static List<String> getElementList(String middleFixExp,boolean fraction)
	{
		
		List<String> list = new ArrayList<String>();
		char [] seprator = null;
		if(fraction)
			seprator = new char[]{'+','-','*','(',')'};
		else
			seprator = new char[]{'+','-','/','*','(',')'};
		int opBeginIndx = -1;
		boolean isOperator = false;
		
		for(int i=0;i<middleFixExp.length();i++)
		{
			char curChar  = middleFixExp.charAt(i);
			isOperator = false;
			for(int j=0;j<seprator.length;j++)
			{
				if(seprator[j] == curChar)
				{   
					if(opBeginIndx != -1)
						list.add(middleFixExp.substring(opBeginIndx, i));
					list.add(curChar+"");
					isOperator  = true;
					opBeginIndx = -1;
					break;
				}
			}
			if(isOperator)
				continue;
			if(opBeginIndx == -1)
				opBeginIndx = i;
		}
		if(opBeginIndx != -1)
			list.add(middleFixExp.substring(opBeginIndx));
		return list;
	}
	
	public static String evaluate(String exp,boolean fraction)
	{
	
		Stack<String> sta = new Stack<String>();
		List<String> list = toPostfixExp(exp,fraction);
		String s ="";
		while(list.size()>0)
		{
			s = list.remove(0);
			if(s.length()==1 && !(s.charAt(0)>='0'&&s.charAt(0)<='9'))
			{
				String y = sta.pop();
				String x = sta.pop();
				
				if("+-*/".indexOf(s)>=0)
				{
					String result = "";
					if(fraction)
						result =caculateFraction(x,y,s.charAt(0));
					else
						result =caculateInteger(x,y,s.charAt(0));
					sta.push(result);
						
				}
				else throw new RuntimeException("not support operator:"+s); 
					
			}
			else
			{
				sta.push(s);
			}
		}
		
		return sta.pop();
	}
	
	private static String caculateInteger(String x,String y,char operator)
	{
		int px = Integer.parseInt(x);
		int py = Integer.parseInt(y);
		int result = 0;
		switch(operator)
		{
		case '+':
			result = px + py;
	        break;
		case '-' :
			result = px - py ;
			break;
		case '*' :
			result = px * py;
			break;
		case '/' :
			result = px / py;
			break;
		}
		return result+"";
	}
	
	private static String caculateFraction(String x,String y,char operator)
	{
		int dx = 1, dy = 1,nx = 1, ny = 1;
		if(x.indexOf("/")>0)
		{
			dx = Integer.parseInt(x.substring(x.indexOf("/")+1));
			nx = Integer.parseInt(x.substring(0,x.indexOf("/")));
		}else
		{
			nx = Integer.parseInt(x);
		}
		
		if(y.indexOf("/")>0)
		{
			dy = Integer.parseInt(y.substring(y.indexOf("/")+1));
			ny = Integer.parseInt(y.substring(0,y.indexOf("/")));
		}else
		{
			ny = Integer.parseInt(y);
		}
		
		String s = "";
		int sn = 0;
		int sd = 1;
		switch(operator)
		{
		
		 case '+':
			  sn = nx*dy+ny*dx;
			  sd = dx*dy;
			
			 break;
		 case '-':
			  sn = nx*dy-ny*dx;
			  sd = dx*dy;
			 if(sn%sd==0)
				 s = (sn/sd)+"";
			 else
				 s =  sn+"/"+sd;
			 break;
		 case '*':
			 sn = nx*ny;
			 sd = dx*dy;
			 break;
		 case '/':	 
			 sn = nx*dy;
			 sd = ny*dx;
			 break;
		}
		
		 if(sn%sd==0)
			 s = (sn/sd)+"";
		 else
			 s =  sn+"/"+sd;
		 return s;
	}
	
	private static int getPriority(char operator)
	{
		switch(operator)
		{
			case '+':
				return 0;
			case '-':
				return 0;
			case '*' :
				return 1;
			case '/' :
				return 1;
			case '%' :
				return 1;
			default :
				return -1;
		}
	}
	
	public static void main(String args[])
	{
//		System.out.println(Integer.parseInt("4/5"));
		String s ="+";
		System.out.println(s.length()==0 && !(s.charAt(0)>='0'&&s.charAt(0)<='9'));
		List<String> list = toPostfixExp("12+((3*(2-4/5))+5)*3",true);
		System.out.println(OperationUtil.evaluate("3+2-9", true));
	}
}

分享到:
评论

相关推荐

    Delphi表达式计算(用了这么多这个比较好)

    在Delphi中处理表达式计算是一项常见的任务,尤其是当你需要动态地根据某些条件来评估数学或逻辑表达式时。标题提到的“Delphi表达式计算”是指在Delphi程序中实现对用户输入或程序内部生成的表达式的求值。 Delphi...

    Delphi 表达式计算控件formula最新版,支持很多数学函数

    在Delphi编程环境中,开发人员有时需要处理复杂的数学表达式计算任务。为了简化这一过程,存在专门的控件,如Formula,它是一个高效且功能丰富的表达式计算组件。Formula控件能够帮助开发者处理各种数学函数,并且...

    自定义表达式计算 (c#)

    在IT行业中,自定义表达式计算是一个常见的需求,特别是在软件开发和数据分析领域。本文将深入探讨如何使用C#实现一个自定义表达式计算引擎,包括词法分析、语法分析以及如何支持自定义关键字和语法规则。这对于在...

    易语言JS脚本组件表达式计算

    在"易语言JS脚本组件表达式计算"这个主题中,我们将探讨如何利用易语言与JavaScript的交互,进行表达式计算。 首先,我们需要了解易语言中的组件机制。在易语言中,组件通常是一些预先编写好的、可重用的代码模块,...

    Java算术表达式计算类库 ExpressionJ

    **Java算术表达式计算类库 ExpressionJ** ExpressionJ是一个强大的Java库,专门设计用于解析和计算数学算术表达式。这个库对于那些在应用程序中需要动态计算复杂数学表达式的开发者来说,是一个非常有用的工具。它...

    C#实现表达式计算示例

    C#实现表达式计算的例子,支持变量。 如输入 1+2+3+(4*5) 输出:26 string[] key={"a","b","c"}; string[] val={"1","2","3"}; 输入:a+b+c 输出6

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

    在易语言中,表达式计算公式解析是编程过程中一个重要的环节,它涉及到对数学表达式的处理、计算以及错误检查等复杂任务。 表达式计算公式解析的核心在于解析器,这个解析器会将用户输入的字符串形式的表达式转化为...

    编译原理表达式计算

    本项目聚焦于表达式计算,通过两种不同的方法来实现这一过程:一种是扫两遍表达式的方法,另一种是扫一遍表达式的方法。这两种方法在编译器设计和解析技术中具有重要的地位。 首先,我们讨论扫两遍表达式的计算方法...

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

    在这个项目中,Java 被用来编写数学表达式计算程序,展示了其在软件开发中的灵活性。 2. 知识点:课程设计 该项目作为课程设计的一部分,旨在让学生应用所学的 Java 语言知识,通过实践提高编程技能和问题解决能力...

    c# 表达式计算 .net 2008

    在本主题中,我们将深入探讨"C#表达式计算"以及如何在.NET 2008环境下处理四则运算,包括加法(+)、减法(-)、乘法(*)、除法(/)以及负号(-)的操作。 首先,表达式是编程语言中的基本组成部分,它们可以代表...

    计算器,支持表达式计算

    【计算器,支持表达式计算】 本程序是一款基于Win32 API开发的计算器应用,它具有表达式计算功能,用户可以直接输入数学表达式进行计算,极大地扩展了传统计算器的基础运算能力。这款计算器是使用Visual Studio ...

    Expression of Value表达式计算

    在计算机科学领域,表达式计算是一项基础且重要的任务,它涉及到如何正确地解析和求解数学或逻辑表达式。在本题"Expression of Value表达式计算"中,我们需要处理的是带有括号的算术表达式,这类问题通常可以通过逆...

    利用后缀表达式计算中缀表达式的值.数据结构

    将上述概要内容综合起来,我们能够清晰地看到,这一利用后缀表达式计算中缀表达式的值的程序,不仅是一个功能强大的计算器,更是展示了数据结构、C语言编程、MFC界面设计以及错误处理等多个方面知识的综合运用实例。...

    数据结构课程设计---表达式计算

    根据给定的信息,我们可以推断出这是一个关于表达式计算的数据结构课程设计项目。该课程设计主要涉及到了栈这种数据结构的应用以及如何通过栈来解析并计算各种数学逻辑表达式。 ### 一、栈的基本概念 栈是一种特殊...

    C语言表达式计算原代码详解

    ### C语言表达式计算原代码详解 在C语言中,表达式的解析与计算是一个常见的需求,尤其是在编写计算器程序、解析数学公式或者处理涉及数学运算的数据时。本文将深入解析一个C语言实现的表达式计算代码,该代码能够...

    数学表达式计算c++

    在C++编程中,实现数学表达式计算是一个常见的需求,特别是在科学计算、工程应用和游戏开发等领域。这个项目显然旨在创建一个能够解析和求解包含常见数学函数的数学表达式的库。下面我们将深入探讨实现这样的功能所...

    两种表达式计算实验报告

    在IT领域,表达式计算是计算机科学中的一个基础部分,主要涉及到如何解析和求解数学或逻辑表达式。本实验报告深入探讨了两种不同的计算方法:中缀转后缀(逆波兰表示法)以及中缀表达式的直接计算。这两种方法在理解...

    python开发的任意表达式计算求值

    基于算符优先算符的python开发的任意表达式计算求值类。 支持减号/负号,一符两用机制 支持浮点数、整数、字符串(用一个“开头,仿lisp语法) 支持所有算术运算符,包括**,//, % 支持全部7个比较运算符 支持与或非...

    数据结构大作业C++实现简单的计算器——算术表达式计算(包含实验报告)

    表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。 【基本要求】 以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。...

Global site tag (gtag.js) - Google Analytics