23种设计模式-java-解释器

模式概述:

解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。

使用场景:

只在一些特定的领域会被用到,比如编译器、规则引擎、正则表达式。

代码样例:

代码背景: 定义一个加减乘除的计算语言;表达式只有加、减、乘、除,且没有优先级;表达式前面是数字,后面是运算符,空格隔开;数字按照从左到右顺序,运算符按照从右到左顺序,取出两个数字和运算符进行计算,计算结果放入头部,循环此过程,直到只剩下一个数字,即为计算结果。比如”5 2 1 - +“;第一次计算,取出 5和2进行加法处理得到7,表达式变成”7 1 -“,再次进行计算,得到最终结果6。

/**
 * 解释器
 */
public class Interpreter {
    public static void main(String[] args) {
        String string = new String("5 2 1 - +");
        int result = execute(string);
        System.out.println("输入:"+string);
        System.out.println("输出:"+result);

    }

    public static int execute(String string){
        int result = 0;
        String array[] = string.split(" ");
        Deque<Integer> numberList = new LinkedList<>();
        if(array.length<=1) throw new RuntimeException();

        for (int i=0;i<(array.length+1)/2;i++){
            numberList.add(Integer.parseInt(array[i]));
        }

        for (int j = array.length-1;j>((array.length+1)/2)-1;j--){
            String operator = array[j];
            boolean isValid = "+".equals(operator) ||
                    "-".equals(operator) ||
                    "*".equals(operator) ||
                    "/".equals(operator);
            if (!isValid) {
                throw new RuntimeException();
            }

            int number1 = numberList.pollFirst();
            int number2 = numberList.pollFirst();
            if("+".equals(operator)){
                numberList.addFirst(number1+number2);
            }else if("-".equals(operator)){
                numberList.addFirst(number1-number2);
            }else if("*".equals(operator)){
                numberList.addFirst(number1*number2);
            }else if("/".equals(operator)){
                numberList.addFirst(number1/number2);
            }

        }

        return numberList.pollFirst();
    }
}

测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值