阅读更多

0顶
0踩

编程语言

 

  好多的  加法运算 ,没有发现  加括号的 的加减乘除的 解释器,参考了 别人的 算法,写了 这个 ,只能说别人的算法好,,,,

 

算法地址:http://blog.sina.com.cn/s/blog_6759f4610100j2qt.html

 

 

 

 

package 设计模式.解释器模式;

import java.util.HashMap;
import java.util.Map;

public class Context {
	private final Map<String, Integer> valueMap = new HashMap<String, Integer>();

	public void addValue(final String key, final int value) {
		valueMap.put(key, Integer.valueOf(value));
	}

	public int getValue(final String key) {
		return valueMap.get(key).intValue();
	}
}

 

package 设计模式.解释器模式;

public abstract class AbstractExpression {
	 public abstract int interpreter(Context context);
}

 

package 设计模式.解释器模式;

public class TerminalExpression extends AbstractExpression {
	private final int i;

	public TerminalExpression(final int i) {
		this.i = i;
	}

	@Override
	public int interpreter(final Context context) {
		return this.i;
	}

}

  

 

package 设计模式.解释器模式;

public class AddNonterminalExpression extends AbstractExpression {
	private final AbstractExpression left;
	private final AbstractExpression right;

	public AddNonterminalExpression(final AbstractExpression left,
			final AbstractExpression right) {
		this.left = left;
		this.right = right;
	}

	@Override
	public int interpreter(final Context context) {
		return this.left.interpreter(context) + this.right.interpreter(context);
	}

}

 

package 设计模式.解释器模式;

public class SubtractNonterminalExpression extends AbstractExpression {
	private final AbstractExpression left;
	private final AbstractExpression right;

	public SubtractNonterminalExpression(final AbstractExpression left,
			final AbstractExpression right) {
		this.left = left;
		this.right = right;
	}

	@Override
	public int interpreter(final Context context) {
		return this.left.interpreter(context) - this.right.interpreter(context);
	}
}

 

package 设计模式.解释器模式;

public class MultiplyNonterminalExpression extends AbstractExpression {
	private final AbstractExpression left;
	private final AbstractExpression right;

	public MultiplyNonterminalExpression(final AbstractExpression left,
			final AbstractExpression right) {
		this.left = left;
		this.right = right;
	}

	@Override
	public int interpreter(final Context context) {
		return this.left.interpreter(context) * this.right.interpreter(context);
	}

}

  

package 设计模式.解释器模式;

public class DivisionNonterminalExpression extends AbstractExpression {
	private final AbstractExpression left;
	private final AbstractExpression right;

	public DivisionNonterminalExpression(final AbstractExpression left,
			final AbstractExpression right) {
		this.left = left;
		this.right = right;
	}

	@Override
	public int interpreter(final Context context) {
		final int value = this.right.interpreter(context);
		if (value != 0) {
			return this.left.interpreter(context) / value;
		}
		return -1111;
	}
}

  

package 设计模式.解释器模式;
 
//解释器模式定义语言的文法,并且建立一个解释器来解释该语言中的句子。它属于类的行为模式。这里的语言意思是使用规定格式和语法的代码。
//应用环境:
//如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。
//这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。而且当文法简单、效率不是关键问题的时候效果最好。
public class InterpreterDemo {
	// 40~47  ( ) * + , - . /      0~9 是 48~57 a~z 是 97~122 A~Z 是 65~90     61 =
	// ( a+ b * ( a + b ) * a ) * b + a
	
	// [1, +, 2, *, (, 3, +, 4, *, 5, ), *, 1, #]
	

class NumQueue {
	char num[];
	int head, rear;

	NumQueue() {
		num = new char[1];
		head = -1;
		rear = -1;
	}

	public boolean isEmpty() {
		if (head == rear)
			return true;
		else
			return false;
	}

	public void inQueue(char ch) {
		num[++rear] = ch;
	}

	public void init() {
		head = -1;
		rear = -1;
		for (int i = 0; i < 1; i++)
			num[i] = '\0';
	}

	public String getNumber() {
		String str = new String(num); 
		return str;
	}
}
 
class StackAbstractExpression {
	AbstractExpression data[];
	int top;
	int base;

	StackAbstractExpression() {
		data = new AbstractExpression[15];
		top = -1;
		base = -1;
	}

	public AbstractExpression getTop() {
		return data[top];
	}

	public void push(AbstractExpression ae) {
		data[++top] = ae;
	}

	public AbstractExpression pop() {
		return data[top--];
	}

	public boolean isEmpty() {
		if (top == base)
			return true;
		else
			return false;
	}

	public void init() {
		top = -1;
		base = -1;
	}
}

class StackOper {
	char data[];
	int top;
	int base;

	StackOper() {
		data = new char[20];
		top = -1;
		base = -1;
	}

	public char getTop() {
		return data[top];
	}

	public void init() {
		top = -1;
		base = -1;
	}

	public void push(char ch) {
		data[++top] = ch;
	}

	public char pop() {
		return data[top--];
	}

	public boolean isEmpty() {
		if (top == base)
			return true;
		else
			return false;
	}
}

	
	
	static StackAbstractExpression stackData;
	static StackOper stackOper;
	static NumQueue queue;
	static boolean  rs, divErr = false;
	public static void   doHandler(String exp, Context context){
		queue = new InterpreterDemo().new NumQueue(); 
		stackData =  new InterpreterDemo().new StackAbstractExpression();
		stackOper =  new InterpreterDemo().new StackOper();
		exp = exp.replaceAll(" ","");
		exp+= "#";
		stackOper.init();
		stackData.init();
		stackOper.push('#');
		String dou = "";
		int ps = 0, pc = 0; 
		System.out.println(" exp: "+exp);
		
		char ch[] = exp.toCharArray();

		char op;
		int i = 0;
		op = ch[i];

		while (op != '#' || stackOper.getTop() != '#') {
			if ((op > 96 && op < 123) ) {
				queue.inQueue(op);
				i++;
				op = ch[i];
			} else {
				if (!queue.isEmpty()) {
					dou = queue.getNumber();
					//System.out.println ("stackData.push  (" + dou + ") ");
					stackData.push(new TerminalExpression(context.getValue(dou)));
					queue.init();
				}
				ps = getSPri(stackOper.getTop());
				pc = getCPri(op);
				if (stackOper.getTop() == '(' && op == '#'
						|| stackOper.getTop() == ')' && op == '('
						|| stackOper.getTop() == '#' && op == ')') { 
					rs = true;
				}
				if (ps < pc) {
					//System.out.println (" 操作符在栈内的优先级 " + ps +" 操作符进栈的优先级优先级 "+ pc +" "+ "stackOper.push  " + op + " ");
					stackOper.push(op);
					i++;
					op = ch[i];
				}
				if (ps == pc) {
					char c = stackOper.pop();
					//System.out.println  (" 操作符在栈内的优先级 " + ps +" 操作符进栈的优先级优先级 "+ pc + "stackOper.pop  " + c + " ");
					op = ch[++i];
				}
				if (ps > pc) {
					char theta = stackOper.pop();
					AbstractExpression b =   stackData.pop();
					AbstractExpression a =  stackData.pop();
					stackData.push(operate(a, b, theta));
					//System.out.println  (" 操作符在栈内的优先级 " + ps +" 操作符进栈的优先级优先级 "+ pc +" stackData.push  "  +operate(a, b, theta)+ " ");
				}
			}
		}
		double res = stackData.getTop().interpreter(context);
		System.out.println(res);
		rs = true;
	
	}
	
	public static AbstractExpression operate(AbstractExpression a, AbstractExpression b, char ch) {
		AbstractExpression res =null;
		switch (ch) {
		case '+':
			res = new AddNonterminalExpression( a, b);
			break;
		case '-':
			res = new SubtractNonterminalExpression( a, b);
			break;
		case '*':
			res = new MultiplyNonterminalExpression( a, b);
			break;
		case '/':
			res = new DivisionNonterminalExpression( a, b);
				break; 
		default: 
			break;
		}
		return res;
	} 

	// 操作符在栈内的优先级
	public static int getSPri(char op) {
		int pr = 0;
		switch (op) {
		case ')':
			pr = 6;
			break;
		case '*':
			pr = 5;
			break;
		case '/':
			pr = 5;
			break;
		case '+':
			pr = 3;
			break;
		case '-':
			pr = 3;
			break;
		case '(':
			pr = 1;
			break;
		case '#':
			pr = 0;
			break;
		}
		return pr;
	}

	// 操作符进栈的优先级优先级
	public static int getCPri(char op) {
		int pr = 0;
		switch (op) {
		case ')':
			pr = 1;
			break;
		case '*':
			pr = 4;
			break;
		case '/':
			pr = 4;
			break;
		case '+':
			pr = 2;
			break;
		case '-':
			pr = 2;
			break;
		case '(':
			pr = 6;
			break;
		case '#':
			pr = 0;
			break;
		}
		return pr;
	}
	
	
	public static void main(String[] args) {
		final Context context = new Context();
		context.addValue("a", 1);
		context.addValue("b", 2); 
		doHandler("(a+b*(a+b)*a)*b+a",context);
	}
}

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0
0
评论 共 1 条 请登录后发表评论
1 楼 JQ_AK47 2017-04-28 09:49
太复杂了,看不懂

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Android编程设计模式之解释器模式详解

    本文实例讲述了Android编程设计模式之解释器模式。分享给大家供大家参考,具体如下: 一、介绍 解释器模式(Interpreter Pattern)是一种用的比较少的行为型模式,其提供了一种解释语言的语法或表达式的方式,该模式...

  • JAVA设计模式之解释器模式详解

    主要介绍了JAVA设计模式之解释器模式详解,解释器模式是类的行为模式,给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器,需要的朋友可以参考下

  • 设计模式之解释器模式

    解释器模式字面意思,也即解释...比如SQL解析,符号处理引擎,会用到解释器模式,属于更底层的开发人员才会用到的设计模式。本文就以解释器模式的概念、角色和简单的例子说明解释器模式,读者对这部分内容了解即可。

  • Java设计模式之解释器模式(Interpreter模式)介绍

    主要介绍了Java设计模式之解释器模式(Interpreter模式)介绍,Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子,需要的朋友可以参考下

  • Python设计模式之解释器模式原理与用法实例分析

    本文实例讲述了Python设计模式之解释器模式原理与用法。分享给大家供大家参考,具体如下: 解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释...

  • PHP设计模式之解释器模式的深入解析

    本篇文章是对PHP设计模式中的解释器模式进行了详细的分析介绍,需要的朋友参考下

  • Java设计模式之解释器模式_动力节点Java学院整理

    解释器模式是一个比较少用的模式,本人之前也没有用过这个模式。下面我们就来一起看一下解释器模式

  • Java设计模式之解释器模式(UML类图分析+代码详解)

    解释器模式(Interpreter Pattern):是指给定一个语言(表达式),定义它的文法 的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式),1、应用可以将一个需要解释执行的语言中的句子表示为一个...

  • java23中设计模式之解释器模式

    java设计模式之解释器模式,自己根据理解还有参考弄的,看不懂的可以细聊

  • 设计模式之解释器模式(C++)

    介绍设计模式之解释器模式

  • 设计模式之解释器模式Java版本实现

    设计模式之解释器模式的Java版本实现和UML类图设计

  • java常用设计模式-解释器模式

    java常用设计模式-解释器模式

  • PHP设计模式之解释器(Interpreter)模式入门与应用详解

    本文实例讲述了PHP设计模式之解释器(Interpreter)模式。分享给大家供大家参考,具体如下: 解释器模式,它是什么呢? 意思就是,给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来...

  • 23种设计模式之解释器模式(Interpreter Pattern)

    本篇文章将23种设计模式中的解释器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

  • 基于SpringBoot+Vue的“智慧食堂”设计与实现(Java毕业设计,包括源码、数据库、教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

  • 历届奥运会奖牌数据(1896-2024年).xlsx

    本次分享的数据为1896年-2024年(从雅典到巴黎)间奥运会奖牌数据,包括年份、届次、国家地区、名次、金牌、银牌、铜牌等数据,含免费下载链接 ## 一、数据介绍 数据名称:历届奥运会奖牌数据 数据范围:世界各国 样本数量:1877条 数据年份:1896年-2024年 数据说明:包括届次、国家、名次等数据

  • 基于SpringBoot+Vue的实习管理系统(Java毕业设计,包括源码、数据库、教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

  • 【人机交互】MATLAB直车道线检测.zip

    【人机交互】MATLAB直车道线检测

Global site tag (gtag.js) - Google Analytics