解释器模式

public abstract class Expression {

    /* 解析公式和数值,其中var中的key值是公式中的参数,value值是具体的数字  */
    public abstract int interpreter(HashMap<String, Integer> var);

}

public abstract class SymbolExpression extends Expression{

    protected Expression left;
    protected Expression right;

    /* 所有的解析公式都应只关心自己左右两个表达式的结果 */
    public SymbolExpression(Expression _left,Expression _right){
        this.left = _left;
        this.right= _right;
    }

}

/**
 * 减法解析器
 * @author Administrator
 */
public class SubExpression extends SymbolExpression{

    public SubExpression(Expression _left, Expression _right) {
        super(_left, _right);
    }

    /* 左右两个表达式相减 */
    public int interpreter(HashMap<String, Integer> var) {
        return super.left.interpreter(var) - super.right.interpreter(var);
    }

}

/**
 *
 * 加法解析器
 * @author Administrator
 */
public class AddExpression extends SymbolExpression{

    public AddExpression(Expression _left,Expression _right){
        super(_left, _right);
    }

    /* 把左右两个表达式运算的结果加起来  */
    public int interpreter(HashMap<String, Integer> var) {
        return super.left.interpreter(var) + super.right.interpreter(var);
    }
}

/**
 * 封装解析器
 * @author Administrator
 */
public class Calculator {
    /* 定义的表达式 */
    private Expression expression;

    /* 构造函数传参,并解析 */
    public Calculator(String expStr){
        /* 定义一个堆栈,安排运算的先后顺序 */
        Stack<Expression> stack = new Stack<Expression>();

        char[] charArray = expStr.toCharArray();

        Expression left = null;
        Expression right= null;

        for(int i=0; i<charArray.length; i++){
            switch (charArray[i]) {
            case '+' : //加法
                /* 加法结果放到堆栈中 */
                left = stack.pop();
                right = new TerminalExpression(String.valueOf(charArray[++i]));
                stack.push(new AddExpression(left, right));
                break;
            case '-' : //加法
                left = stack.pop();
                right =  new TerminalExpression(String.valueOf(charArray[++i]));
                stack.push(new SubExpression(left, right));
                break;
            default: //公式中的变量
                stack.push(new TerminalExpression(String.valueOf(charArray[i])));
                break;
            }
        }
        /* 把运算结果抛出来  */
        this.expression = stack.pop();
    }
    /**
     * 开始运算
     * @param var
     */
    public int run(HashMap<String, Integer> var){
        return this.expression.interpreter(var);
    }
}

public class TerminalExpression extends Expression{

    private String key;

    public TerminalExpression(String _key){
        this.key = _key;
    }

    /* 通常终结符表达式只有一个,但是有多个对象 */
    public int interpreter(HashMap<String, Integer> var) {
        return var.get(this.key);
    }

}

/**
 * 解释器模式
 * @author Administrator
 */
public class Client {
    public static void main(String[] args) throws IOException{
        //运行四则运算
        String expStr = getExpStr();
        //赋值
        HashMap<String, Integer> var = getValue(expStr);
        Calculator cal = new Calculator(expStr);
        System.out.println("运算结果为:"+expStr +"=" + cal.run(var));
    }

    /* 获得表达式 */
    public static String getExpStr() throws IOException{
        System.out.println("请输入表达式:");
        return (new BufferedReader(new InputStreamReader(System.in))).readLine();
    }

    /* 获得值映射  */
    public static HashMap<String, Integer> getValue(String expStr) throws IOException{
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        for(char ch : expStr.toCharArray()){
            if(ch != '+' && ch != '-'){
                /* 解决重复参数的问题 */
                if(!map.containsKey(String.valueOf(ch))){
                    System.out.println("请输入 "+ch+" 的值:");
                    String in = (new BufferedReader(new InputStreamReader(System.in))).readLine();
                    map.put(String.valueOf(ch), Integer.valueOf(in));
                }
            }
        }
        return map;
    }
}


运行结果:

请输入表达式:
a+b-c
请输入 a 的值:
100
请输入 b 的值:
2
请输入 c 的值:
101
运算结果为:a+b-c=1
基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip 【备注】 1、该资源内项目代码百分百可运行,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值