阅读更多

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、应用可以将一个需要解释执行的语言中的句子表示为一个...

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

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

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

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

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

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

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

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

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

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

  • 人力资源经理绩效考核表.xls

    人力资源经理绩效考核表

  • 智慧环卫管理平台建设方案Word(211页).docx

    一、智慧环卫管理平台的建设背景与目标 智慧环卫管理平台的建设源于对环卫管理全面升级的需求。当前,城管局已拥有139辆配备车载GPS系统、摄像头和油耗传感器的环卫车辆,但环卫人员尚未配备智能移动终端,公厕也缺乏信息化系统和智能终端设备。为了提升环卫作业效率、实现精细化管理并节省开支,智慧环卫管理平台应运而生。该平台旨在通过信息化技术和软硬件设备,如车载智能终端和环卫手机App,实时了解环卫人员、车辆的工作状态、信息和历史记录,使环卫作业管理透明化、精细化。同时,平台还期望通过数据模型搭建和数据研读,实现更合理的环卫动态资源配置,为环卫工作的科学、健康、持续发展提供决策支持。 二、智慧环卫管理平台的建设内容与功能 智慧环卫管理平台的建设内容包括运行机制体制建设、业务流程设计、智慧公厕系统建设、网络建设、主机和储存平台需求、平台运维管理体系、硬件标准规范体系以及考核评价体系等多个方面。其中,智慧公厕系统建设尤为关键,它能实时监控公厕运行状态,保障公厕的清洁和正常运行。平台建设还充分利用了现有的电子政务网络资源,并考虑了有线和无线网络的需求。在功能上,平台通过普查、整合等手段全面收集环卫车辆、企业、人员、设施、设备等数据,建立智慧环卫基础数据库。利用智能传感、卫星定位等技术实现环卫作业的在线监管和远程监控,实现对道路、公共场所等的作业状况和卫生状况的全面监管。此外,平台还建立了环卫作业网格化管理责任机制,实现从作业过程到结果的全面监管,科学评价区域、部门、单位和人员的作业效果。 三、智慧环卫管理平台的效益与风险规避 智慧环卫管理平台的建设将带来显著的环境、经济和管理效益。环境方面,它将有力推进环境卫生监管服务工作,改善环境卫生状况,为人民群众创造更加清洁、卫生的工作和生活环境。经济方面,通过智慧化监管,大大降低了传统管理手段的成本,提高了监管的准确性和效率。管理方面,平台能够追踪溯源市民反映的问题,如公厕异味、渣土车辆抛洒等,并找到相应的责任单位进行处置,防止类似事件再次发生。同时,平台还拥有强大的预警机制功能,能够在很多环卫问题尚未出现前进行处置。然而,平台建设也面临一定的风险,如部门协调、配合问题,建设单位选择风险以及不可预测的自然灾害等。为了规避这些风险,需要加强领导、统一思想,选择优秀的系统集成商承接项目建设,并做好计算机和应用系统的培训工作。同时,也要注意标准制定工作和相关法律法规的制定工作,以保证系统建设完成后能够真正为环卫管理工作带来便利。

  • apache-parent-10-14.el7.x64-86.rpm.tar.gz

    1、文件内容:apache-parent-10-14.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/apache-parent-10-14.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

  • 用于卫星通信的CTS天线

    用于卫星通信的圆极化CTS天线研究

Global site tag (gtag.js) - Google Analytics