解释器模式详解

Expression.java 

public interface Expression {// 解析公式和数值,其中var 中的key 值是公式中的参数,value 值是具体的数字.public int interpreter(final Map<String, Integer> var);
}

VarExpression.java

public class VarExpression implements Expression {private String key;public VarExpression(final String key) {this.key = key;}/*** 从map中取值.*/@Overridepublic int interpreter(Map<String, Integer> var) {return var.get(this.key);}}

SymbolExpression.java

public abstract class SymbolExpression implements Expression {protected Expression left;protected Expression right;public SymbolExpression(final Expression left, final Expression right) {this.left = left;this.right = right;}@Overridepublic abstract int interpreter(Map<String, Integer> var);}

AddExpression.java

public class AddExpression extends SymbolExpression {/*** @param newLeft* @param newRight*/public AddExpression(Expression left, Expression right) {super(left, right);}/*** {@inheritDoc}*/@Overridepublic int interpreter(Map<String, Integer> var) {return left.interpreter(var) + right.interpreter(var);}}

SubExpression.java

public class SubExpression extends SymbolExpression {/*** @param newLeft* @param newRight*/public SubExpression(Expression left, Expression right) {super(left, right);}/*** {@inheritDoc}*/@Overridepublic int interpreter(Map<String, Integer> var) {return left.interpreter(var) - right.interpreter(var);}}

Calculator.java

public class Calculator {// 定义表达式.private Expression expression;public Calculator(final String expr) {// 定义一个栈,安排运算的先后顺序.final Stack<Expression> stack = new Stack<>();char[] charArray = expr.toCharArray();// 运算.Expression left = null;Expression right = null;for (int i=0; i<charArray.length; i++) {switch(charArray[i]) {case '+':left = stack.pop();right = new VarExpression(String.valueOf(charArray[++i]));stack.push(new AddExpression(left, right));break;case '-':left = stack.pop();right = new VarExpression(String.valueOf(charArray[++i]));stack.push(new SubExpression(left, right));break;default:stack.push(new VarExpression(String.valueOf(charArray[i])));}}// 把运算结果抛出来.this.expression = stack.pop();}/*** 开始运算.* @param var* @return*/public int run(Map<String, Integer> var) {return this.expression.interpreter(var);}
}

Client.java

public class Client {/*** @param args*/public static void main(String[] args) {String expr = readExpressionString();Map<String, Integer> var = getValue(expr);Calculator cal = new Calculator(expr);System.out.println("运算结果为:" + expr + "=" + cal.run(var));}/*** 获得表达式.* @return*/public static String readExpressionString() {System.out.println("请输入表达式:");return readLine();}private static String readLine() {try {final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));return reader.readLine();} catch (IOException e) {throw new RuntimeException(e.getMessage(), e);}}public static Map<String, Integer> getValue(final String expr) {Map<String, Integer> map = new HashMap<>();for(char c : expr.toCharArray()) {if (c != '+' && c != '-') {if (!map.containsKey(String.valueOf(c))) {String in = readLine();map.put(String.valueOf(c), Integer.valueOf(in));}}}return map;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二分查找(c++)

二分查找 二分查找也称折半查找&#xff08;Binary Search&#xff09;&#xff0c;它是一种效率较高的查找方法。但是&#xff0c;折半查找要求线性表必须采用顺序存储结构&#xff0c;而且表中元素按关键字有序排列。它充分利用了元素间的次序关系&#xff0c;采用分治策略&a…

谷歌母公司投资成绩:4大机构各有侧重,投资2个马斯克项目

李杉 编译自 TechCrunch量子位 出品 | 公众号 QbitAIAlphabet&#xff0c;谷歌母公司。和谷歌做的大多数事一样&#xff0c;Alphabet也在大规模进行投资。这这篇文章中&#xff0c;外媒TechCrunch盘点了Alphabet的风险投资情况、它的投资组合的表现&#xff0c;以及该公司的投资…

Redis 数据库入门教程

From&#xff1a;http://www.jb51.net/article/56448.htm Redis 菜鸟教程&#xff1a;http://www.runoob.com/redis/redis-tutorial.html Redis 设计与实现&#xff1a;http://redisbook.com/ Redis基础、高级特性与性能调优&#xff1a;https://www.jianshu.com/p/2f14bc57…

VS2005 添加 Microsoft.Office.Tools.Word.dll 等引用

1. 入门 (Visual Studio Tools for Office)-------------------------------------------http://msdn2.microsoft.com/zh-cn/library/23cw517s(VS.80).aspx 2. Microsoft Visual Studio 2005 Tools for Office Second Edition Runtime (VSTO 2005 SE) (x86)-------------------…

大脑的终极秘密——从狮子也有意识谈起

作者&#xff1a;中国科学院大学教授 谢平理性思维是意识的高级成分&#xff0c;但它并非人类的专利。在自然界的生存斗争中&#xff0c;人类不仅仅需要通过感觉器官去获取外部世界的印象&#xff0c;还需要对外部世界的事物进行归类、判断与推理&#xff0c;决定自己对刺激的…

MS SQL入门基础:触发器概述

在上面几节我们介绍了一般意义的存储过程&#xff0c;即用户自定义的存储过程和系统存储过程。本节将介绍一种特殊的存储过程&#xff0c;即触发器。在余下各节中我们将对触发器的概念、作用以及对其的使用方法作详尽介绍&#xff0c;使读者了解如何定义触发器&#xff0c;创建…

Python集合(set)类型的操作

菜鸟教程&#xff1a;Python3 集合&#xff1a;https://www.runoob.com/python3/python3-set.html Python 的 集合&#xff08;set&#xff09;和 其他语言类似&#xff0c;是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合。基本功能包括关系测试和消…

一个线程池中的线程异常了,那么线程池会怎么处理这个线程?

来源&#xff1a;一个线程池中的线程异常了&#xff0c;那么线程池会怎么处理这个线程? - 反光的小鱼儿 - 博客园 一个线程池中的线程异常了&#xff0c;那么线程池会怎么处理这个线程? 目录 线程池常用问题 不允许使用的原因测试流程 测试用例抛出堆栈异常为啥对了一半?怎…

深度学习:技术原理、迭代路径与局限

来源&#xff1a;36氪作者&#xff1a;何沛宽本文尝试复盘梳理深度学习目前的技术要点&#xff0c;深度学习中模型迭代的方向&#xff0c;以及改进后存在的局限。第一部分&#xff1a;深度学习技术基本要素&#xff1a;神经元、神经网络、分类器、可视化框架在深度学习领域&…

简单而直接的Python web 框架:web.py

From&#xff1a;https://www.oschina.net/question/5189_4306 Web.py github 地址&#xff1a;https://github.com/webpy/webpy https://pypi.python.org/pypi/web.py Web.py Cookbook 简体中文版&#xff1a;http://webpy.org/cookbook/index.zh-cn web.py 0.3 新…

ASP.NET页面的结构

ASP.NET页面的结构一、页指令&#xff1a; 包括Assembly(将一个程序集连接到当前页或用户控件)、 Control(.ascx&#xff0c;定义与控件相关的属性&#xff0c;这些属性指导控件编译器的行为)、 Implements&#xff08;说明该页面或该用户控件…

用图表说话--导言

有些时候不用图表反而做得更好 1、有时候用图表来表示某种精确的内容&#xff08;如&#xff1a;范围和预期&#xff09;&#xff0c;可能产生误导 2、有时候有些数据&#xff08;如&#xff1a;公司的损益情况&#xff09;听众和读者都已习惯了一种固定的表述方式&…

1102 Invert a Binary Tree(甲级)

1102 Invert a Binary Tree (25分) The following is from Max Howell twitter: Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off. Now it’s your turn to prove that YOU CAN invert…

从寻找可敬的人类开始,扩展未来人类生存的8个维度

来源&#xff1a;资本实验室作者&#xff1a;李鑫从小村庄到大城市&#xff0c;从国内到国外&#xff0c;从地球到月球&#xff0c;从太阳系到银河系……什么样的距离才是最远的距离&#xff1f;从地球的内部&#xff0c;到每一个原子&#xff0c;再到我们的情绪&#xff0c;哪…

开源 Python网络爬虫框架 Scrapy

开源 Python 网络爬虫框架 Scrapy&#xff1a;http://blog.csdn.net/zbyufei/article/details/7554322 介绍 所谓网络爬虫&#xff0c;就是一个在网上到处或定向抓取数据的程序&#xff0c;当然&#xff0c;这种说法不够专业&#xff0c;更专业的描述就是&#xff0c;抓取特定网…

SQL2005结合ROW_NUMBER()高效分页存储过程

SQL2005结合ROW_NUMBER()高效分页存储过程&#xff1a;CREATE PROCEDURE [dbo].[sp_Accounts_GetUserListPaged] PageIndex INT, PageSize INT AS BEGIN WITH UserList AS ( SELECT ROW_NUMBER() OVER (ORDER BY RegDate DESC)AS Row, * FROM Accounts_Users) SELECT …

微服务架构设计模式~为应用程序定义微服务架构

为应用程序定义微服务架构 第一步&#xff1a;定义系统操作 第二步&#xff1a;定义服务 第三步&#xff1a;定义服务API和协作方式 第一步&#xff1a;定义系统操作 第二步&#xff1a;定义服务 第三步&#xff1a;定义服务API和协作方式

1079 Total Sales of Supply Chain(甲级)

1079 Total Sales of Supply Chain (25分) A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;经销商&#xff09;, and suppliers&#xff08;供应商&#xff09;-- everyone involved in moving a product from supplier to…

用 Python 爬虫框架 Scrapy 爬取心目中的女神

From &#xff1a;http://www.cnblogs.com/wanghzh/p/5824181.html 本博文将带领你从入门到精通爬虫框架 Scrapy&#xff0c;最终具备爬取任何网页的数据的能力。 本文以校花网为例进行爬取&#xff0c;校花网&#xff1a;http://www.xiaohuar.com 让你体验爬取校花的成就感。 …

深入Atlas系列:综合示例(1) - 调用服务器端方法时直接获得客户端具体类型...

摘要: 在使用ASP.NET AJAX时&#xff0c;大家对于返回服务器端的复杂类型的情况经常会遇到问题。Dflying兄写了一篇文章来说明在如何在客户端得到Sys.Preview.Data.DataTable对象的文章&#xff0c;但是这种方法需要在客户端进行Sys.Preview.Data.DataTable的构造&#xff0c;那…