设计模式之行为型设计模式

y123132 社区新秀 2022-08-18 09:05:25

行为型设计模式

解释器模式

java中用的很。JVM编译的时候就是对我们写的代码进行了解释操作;数据库SQL语句亦是如此

解释器:对语言进行解释,根据不同语义来做不同的事情。

举例:双栈计算器

public class 双栈实现计算器 {
    //设置两栈
    private static Deque<Character> opr = new LinkedList<>();
    private static Deque<Double> number = new LinkedList<>();

    public static void main(String[] args) {
        //接收一串字符串并转字符数组
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        char [] arrC = str.toCharArray();

        for (int i = 0; i < arrC.length;) {
            char c = arrC[i];
            //是+-/*字符时
            if (isChar(c)){
                ///如果栈内有字符,则需要判断优先级,入栈字符小于等于栈内字符则需要先计算栈内字符
                Character peek = opr.peek();    //细节!!! 这里必须先取
                while (peek!=null && isLowIn(c,peek)){
                    cal();
                    peek=opr.peek();       //细节!!这里也必须更新peek
                }
                //入栈
                opr.push(c);
                i++;
            }
            //字符是数字时
            else {
                double sum=0;   //接收整数和
                double sum2=0;  //接收小数和
                int times = 1;  //记录当前小数位数
                boolean flag=false; //是否开启小数检测模式

                //判断下一个是不是+-*/,不是的话就继续判断直到非数字
                while (i<=arrC.length-1 && !isChar(arrC[i])){       //细节:括号内两者顺序不能改变
                    //遇到小数的情况
                    if (arrC[i]=='.'){
                        flag=true;
                    }else {
                        //小数情况
                        if (flag){
                            double val=arrC[i]-'0';
                            for (int j = 0; j < times; j++) {   //细节!用times缩小值
                                val/=10.0;
                            }
                            times++;
                            sum2+=val;
                        }
                        //正数情况
                        else {
                            sum=sum*10+arrC[i]-'0';     //获取多位数字的关键!!!
                        }
                    }
                    i++;
                }
                number.push(sum+sum2);
            }
        }
        //字符都获取完了后栈内还有数字和字符的话,就计算完栈内的数据并输出最终结果
        while (!opr.isEmpty()) cal();
        System.out.println(number.peek());
    }

    //判断是否为字符
    public static boolean isChar(char c) {
        return c=='+'||c=='-'||c=='*'||c=='/';
    }

    //判断优先级是否是栈外字符小于等于栈内字符
    public static boolean isLowIn(char out,char in){
        return (out=='+'||out=='-')||(in=='*'||in=='/');
    }

    public static void cal(){
        //从栈内取出两个数组和一个字符
        double a = number.pop();
        double b = number.pop();
        char c = opr.poll();

        //根据字符c进行不同的运算
        switch (c){
            case '+':
                number.push(a+b);
                break;
            case '-':
                number.push(b-a);
                break;
            case '*':
                number.push(b*a);
                break;
            case '/':
                number.push(b/a);
                break;
            default:
                System.out.println("字符输入有误");
        }
    }

}

 

...全文
113 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-09
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-Java 发布问题, 以便更快地解决您的疑问

31,992

社区成员

发帖
与我相关
我的任务
社区描述
永远相信美好的事情,即将发生
spring cloudspring bootspring 个人社区 山东省·济南市
社区管理员
  • Somnus_小凯
  • 18岁程序员想打职业
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧