`
squll369
  • 浏览: 108690 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

四则运算表达式求解的简单实现

J# 
阅读更多

这2天比较空,就实现了一个四则运算表达式求解,记录在此,它可以计算,带刮号,带小数,正负数的求解,比如下面的算式,"5*33-(-2)*((16-(100-5.12111))-12.35)",但是没有对算式的合法性做验证,如果输入了不合法的表达式,应该会抛RuntimeException.

 

类图:

class

 

1.CaculateExpress

package com.design.study.composite;

import java.math.BigDecimal;


public abstract class CaculateExpress {
	
	protected BigDecimal value = new BigDecimal(0);

	public abstract void add(CaculateExpress s);
		
	public abstract void subtract(CaculateExpress s);
		
	public abstract void multiply(CaculateExpress s);
		
	public abstract void divide(CaculateExpress s);
	
	public String toString(){
		return value.toString();
	}
		
}

 

2.ActualCaculateExpress

package com.design.study.composite;

import java.math.BigDecimal;


public class ActualCaculateExpress extends CaculateExpress {
	
	public ActualCaculateExpress(String s1,String s2, String calExpress){
		if("+".equals(calExpress)){
			value = new BigDecimal(s1).add(new BigDecimal(s2));
		}else if("-".equals(calExpress)){
			value = new BigDecimal(s1).subtract(new BigDecimal(s2));
		}else if("*".equalsIgnoreCase(calExpress)){
			value = new BigDecimal(s1).multiply(new BigDecimal(s2));
		}else if("/".equalsIgnoreCase(calExpress)){
			value = new BigDecimal(s1).divide(new BigDecimal(s2),10,BigDecimal.ROUND_HALF_EVEN);
		}
	}

	@Override
	public void add(CaculateExpress s) {
		value = this.value.add(s.value);
	}

	@Override
	public void divide(CaculateExpress s) {
		value = this.value.divide(s.value,10,BigDecimal.ROUND_HALF_EVEN);
	}

	@Override
	public void multiply(CaculateExpress s) {
		value = this.value.multiply(s.value);
	}

	@Override
	public void subtract(CaculateExpress s) {
		value = this.value.subtract(s.value);
	}	
}

 

3.ActualCaculaterNumber

package com.design.study.composite;

import java.math.BigDecimal;


public class ActualCaculaterNumber extends CaculateExpress {
	
	@Override
	public void add(CaculateExpress s) {
		value = this.value.add(s.value);
	}

	@Override
	public void divide(CaculateExpress s) {
		value = this.value.divide(s.value,10,BigDecimal.ROUND_HALF_EVEN);
	}

	@Override
	public void multiply(CaculateExpress s) {
		value = this.value.multiply(s.value);
	}

	@Override
	public void subtract(CaculateExpress s) {
		value = this.value.subtract(s.value);
	}	
}
 

4.PackageExpress

package com.design.study.composite;

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

public class PackageExpress {
	private boolean flag = false;

	public List<String> l = new ArrayList<String>();

	public PackageExpress(String express) {
		packageExpress(express);
	}

	public void packageExpress(String s) {

		int startLoc = 0;

		if (s.startsWith("+") || s.startsWith("-")) {
			startLoc = 1;
		}
		for (int i = startLoc; i < s.length(); i++) {
			if (!flag) {
				if (checkExpressIsNumber(s)) {
					l.add(s);
					flag = true;
					return;
				}
				if ('+' == s.charAt(i) || '-' == s.charAt(i)
						|| '*' == s.charAt(i) || '/' == s.charAt(i)) {
					l.add(s.substring(0, i));
					l.add(s.substring(i, i + 1));
					s = s.substring(i + 1, s.length());
					packageExpress(s);
				}
			}
		}
	}
	
	private boolean checkExpressIsNumber(String express){
		boolean flag = true;
		
		int startLoc = 0;
		if (express.startsWith("+") || express.startsWith("-")) {
			startLoc = 1;
		}
		
		for(int i=startLoc;i<express.length();i++){
			if ('+' == express.charAt(i) || '-' == express.charAt(i) || '*' == express.charAt(i) || '/' == express.charAt(i)){
				flag = false;
			}
		}
		
		return flag;
	}
}

 

5.SubExpress

package com.design.study.composite;

public class SubExpress {
	private int startLoc;
	private int endLoc;
	private String subExpress;
	private boolean hasHuahao;
	
	public int getStartLoc() {
		return startLoc;
	}
	public void setStartLoc(int startLoc) {
		this.startLoc = startLoc;
	}
	public int getEndLoc() {
		return endLoc;
	}
	public void setEndLoc(int endLoc) {
		this.endLoc = endLoc;
	}
	public String getSubExpress() {
		return subExpress;
	}
	public void setSubExpress(String subExpress) {
		this.subExpress = subExpress;
	}
	public boolean isHasHuahao() {
		return hasHuahao;
	}
	public void setHasHuahao(boolean hasHuahao) {
		this.hasHuahao = hasHuahao;
	}
}
 

6.CaculateExpressResult

package com.design.study.composite;

import java.math.BigDecimal;
import java.util.List;

public class CaculateExpressResult extends ActualCaculaterNumber {

	public CaculateExpressResult(String v) {
		this.value = new BigDecimal(calGuaHaoExpress(v));
	}
	
	private String calGuaHaoExpress(String express){	
		SubExpress s = checkFirst(express);
		String v = calWithoutGuaHaoExpress(s.getSubExpress());
		if(s.isHasHuahao() == false){
			return v;
		}	
		
		String prvCal = null;
		if(s.getStartLoc()-2 >= 0){
			prvCal = express.substring(s.getStartLoc()-2,s.getStartLoc()-1);
		}
		String nextCal = null;
		if(s.getEndLoc()+2 <= express.length()){
			nextCal = express.substring(s.getEndLoc()+1,s.getEndLoc()+2);
		}
		
		if(prvCal != null){
			if (!"+".equals(prvCal) && !"-".equals(prvCal) && !"*".equals(prvCal) && !"/".equals(prvCal) && !"(".equals(prvCal) && !")".equals(prvCal)){
				throw new RuntimeException("Format error!");
			}
		}
		if(nextCal != null){
			if (!"+".equals(nextCal) && !"-".equals(nextCal) && !"*".equals(nextCal) && !"/".equals(nextCal) && !"(".equals(nextCal) && !")".equals(nextCal)){
				throw new RuntimeException("Format error!");
			}
		}
	
		express = express.substring(0, s.getStartLoc()-1) + v.toString() + express.substring(s.getEndLoc()+1, express.length());
		
		
		return calGuaHaoExpress(express);
	}
	
	private String calWithoutGuaHaoExpress(String express){
		List<String> l = new PackageExpress(express).l;
		l = calMulandDivExpress(l);
		l = calAddandSubExpress(l);
		return (String)l.get(0);
	}
	
	private List<String> calMulandDivExpress(List<String> l){	
		for(int i=0;i<l.size();i++){
			if("*".equals(l.get(i)) || "/".equals(l.get(i))){
				CaculateExpress s = new ActualCaculateExpress(l.get(i-1),l.get(i+1),l.get(i));
				l.remove(i-1);
				l.remove(i-1);
				l.remove(i-1);
				l.add(i-1, s.value.toString());			
				calMulandDivExpress(l);
			}
		}
		return l;
	}
	
	private List<String> calAddandSubExpress(List<String> l){	
		for(int i=0;i<l.size();i++){
			if("+".equals(l.get(i)) || "-".equals(l.get(i))){
				CaculateExpress s = new ActualCaculateExpress(l.get(i-1),l.get(i+1),l.get(i));
				l.remove(i-1);
				l.remove(i-1);
				l.remove(i-1);
				l.add(i-1, s.value.toString());		
				calAddandSubExpress(l);
			}
		}
		return l;
	}

	private SubExpress checkFirst(String s){
		int last = 0;
		int huahuaCheck = 0;
		
		for(int i=0;i<s.length();i++){
			if(')' == s.charAt(i)){
				last = i;
				huahuaCheck++;
				break;
			}
		}
		
		int prv = s.length();
		for(int j=last-1;j>=0;j--){
			if('(' == s.charAt(j)){
				prv = j;
				huahuaCheck++;
				break;
			}
		}
		
		SubExpress se = new SubExpress();
		if(huahuaCheck == 2){
			se.setHasHuahao(true);
		}else if(huahuaCheck == 0){
			se.setHasHuahao(false);
			se.setEndLoc(s.length());
			se.setStartLoc(0);
			se.setSubExpress(s);
			return se;
		}else{
			throw new RuntimeException("Format error!");
		}
			
		String t = s.substring(prv+1, last);
		se.setEndLoc(last);
		se.setStartLoc(prv+1);
		se.setSubExpress(t);
		
		return se;
	}

}

 

测试,

 

package com.design.study.composite;

public class CaculateTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String express = "5*33-(-2)*((16-(100-5.12111))-12.35)";
		System.out.println(new CaculateExpressResult(express));
	}

}
  • 大小: 23.6 KB
分享到:
评论

相关推荐

    3_05 V4 (求解简单的四则运算表达式).cpp

    c++程序求解简单的四则运算表达式

    四则运算表达式求值

    按中缀形式输入一个四则运算的表达式,利用算法优选算法把其转换为后缀表达式输出,并求表达式的值。假设输入的表达式中的操作数都是1位整数。

    数据结构:栈的应用-四则算术表达式求解

    在这个主题的实践中,提供的"栈-算术表达式求解Calc"文件很可能是实现这一算法的代码示例。通过阅读和理解这个代码,你可以进一步掌握栈在解决实际问题中的应用,包括如何处理输入的字符串,如何定义栈的结构,如何...

    C语言课程设计-表达式求解

    《C语言课程设计-表达式求解》 在C语言课程设计中,表达式求解是一个常见的实践项目,它涉及到编程基础、数据结构以及算法等多个关键领域。此课程设计的目标是实现一个能够解析并计算任意合法数学表达式的程序。...

    数据结构:栈的应用-算术表达式求解-后序表达式法

    这个过程涉及到了数据结构、数组(在实际编程中实现栈时可能会用到数组)、四则运算以及后序表达式等核心概念。理解并掌握这些知识点,不仅有助于解决实际问题,也是深入学习计算机科学,尤其是编译原理和算法设计的...

    栈的四则运算实现及详解

    当我们面对一个复杂的包含括号的四则运算表达式时,如何有效地计算结果成为一个挑战。此时,栈可以帮助我们解决这一问题: 1. **操作数栈**:用来存储数字。 2. **运算符栈**:用来存储运算符。 #### 三、具体实现...

    二叉树解决四则运算问题

    此外,设计要求是实现一个能够处理整数和浮点数的四则运算计算器,包括加法、减法、乘法、除法以及幂运算。 二叉树在此问题中的作用是表示算术表达式。在计算机科学中,二叉树是一种特殊的树形数据结构,其中每个...

    数据结构,C++实现基于链栈的简单算术表达式求值

    数据结构,C++实现基于链栈的简单算术表达式求值,本项目的目标是实现一个简单的算术表达式求解器,它能够处理基本的加、减、乘、除运算,并使用链栈数据结构进行求值。设计内容:对带括号的任意算术表达式求值。设计...

    表达式求值 c++ 栈数据结构

    下面是一个简单的C++代码示例,演示了如何使用栈来求解四则运算表达式: ```cpp #include #include #include int precedence(char op) { // 定义运算符的优先级 } int applyOp(int a, int b, char op) { // ...

    C#实现的表达式解析型计算器

    但限于本人水平有限,仅仅实现了基本的四则运算表达式的求解。  此外,本软件仍有许多错误、不足之处,尤其是输入表达式时,请严格按照规定的格式(详见格式说明)书写。虽然本计算器有基本的格式错误提示功能,但...

    数据结构课设--四则运算练习软件

    栈可以用来实现运算表达式的后缀表示法(也称为逆波兰表示法),从而简化四则运算的求解过程;队列则可能在处理用户输入的运算请求时发挥作用,保证先进先出的顺序。 其次,四则运算的实现涉及到算法的设计。加、减...

    易语言四则运算分析计算源码

    在实际应用中,四则运算常用于各种复杂的逻辑计算,比如数学问题的求解、游戏规则的实现、数据处理等。理解并能熟练运用四则运算是编程的基础,也是进一步学习易语言和其他编程语言的关键。 "SanYe"可能是这个资源...

    二叉树实现简易计算器

    ### 二叉树实现简易计算器 #### 概述 本文档介绍了一个利用二叉树来实现简易计算器的程序。...这种实现方式不仅适用于简单的数学表达式处理,也为理解和学习数据结构及算法提供了一个很好的案例。

    四则运算计算器 控制台程序

    在编程领域,创建一个四则运算计算器的控制台程序是一项基础任务,它涉及到基本的算术运算符和逻辑处理。这个程序通常会接受用户输入的数学表达式,并根据加法(+)、减法(-)、乘法(*)和除法(/)进行计算。下面...

    sizeyunsuan.rar_四则表达式_表达式

    四则运算表达式在计算机科学和编程领域是基础且重要的概念。它们涉及到加法、减法、乘法和除法这四种基本算术操作。在处理这类表达式时,我们通常需要将其转换成不同的形式以便于计算。在这个场景中,"sizeyunsuan....

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

    它可以支持基本的四则运算(加、减、乘、除),同时涵盖了更高级的数学函数,例如指数、对数、三角函数(正弦、余弦、正切)、反三角函数、平方根、立方根等。此外,它还可能支持复数运算、矩阵计算以及统计和概率...

    算数表达式的求解课程设计报告.doc

    例如,操作符的输入函数 int In(char c) 用于读取算数表达式,运算符比较优先级函数 char Proceed(char op,char c) 用于比较运算符的优先级,进行四则运算函数 int Operate(int a,char a1,int b) 用于执行四则运算等...

    C++计算多项式的四则运算

    C++作为一种强大的、面向对象的编程语言,提供了丰富的数据结构和算法库,使得实现多项式的四则运算变得可能。本篇文章将深入探讨如何使用C++来计算如"2x^2 + 3x^3"这样的多项式的加法、减法、乘法和除法。 首先,...

    VC++ 简易计算器 表达式求值

    除了基本的四则运算,此计算器还实现了开方功能。开方运算通常涉及到浮点数计算和平方根函数,这需要对C++的标准库有深入了解,特别是库中的sqrt函数。开方操作可能需要额外的错误处理,比如检查被开方数是否为负数...

    数据结构 表达式求值

    ### 数据结构与表达式求值知识点解析 #### 一、问题背景及定义 在计算机科学领域,**表达式求值**是一项基础而重要的任务。它涉及到如何解析并计算由数字和运算符组成的数学表达式的值。例如,对于表达式 `3 * (9 ...

Global site tag (gtag.js) - Google Analytics