当前位置: 首页 > news >正文

一个java实现的简单的4则运算器

有些基础知识有欠缺,补一下,顺便练习一下java

import com.sun.deploy.util.ArrayUtil;

import java.util.*;

public class Main {


    public static int op_priority(char c) {
        switch (c) {
            case '(':
                return 18;
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 4;
            default:
                return -1;
        }
    }

    private static Set<Character> operators = new HashSet<>();

    static
    {
        operators.add('+');
        operators.add('-');
        operators.add('*');
        operators.add('/');
        operators.add('(');
        operators.add(')');
    }

    public static String infix2postfix(String exp) throws Exception {
        Stack<Character> ops = new Stack<Character>();
        StringBuilder sb = new StringBuilder();
        List<String> result = new ArrayList<>();


        int i = 0;
        String digit = new String();
        while (i < exp.length()) {
            char c = exp.charAt(i);
            if (!operators.contains(c)) {
                digit += c;
            } else {
                if (!digit.isEmpty())
                    result.add(digit);
                digit = "";

                if (ops.empty()) {
                    ops.push(c);
                } else if (c == ')') {
                    while (!ops.empty() &&  ops.peek() != '(') {
                        result.add(ops.pop().toString());
                    }
                    if (ops.empty()) {
                        throw new Exception("no (");
                    } else {
                        ops.pop();  // pop (
                    }

                } else if (op_priority(ops.peek()) < op_priority(c)) {
                    ops.push(c);
                } else if (ops.peek() == '(') {
                    ops.push(c);
                } else {
                    result.add(ops.pop().toString());
                    ops.push(c);
                    digit += exp.charAt(i + 1);
                    ++i;

                }
            }
            ++i;
        }

        if (digit != "") {
            result.add(digit);
        }

        while (ops.size() > 0) {
            result.add(ops.pop().toString());
        }
        for (String s : result) {
            sb.append(s);
            sb.append(" ");
        }
        return sb.toString();
    }

    public static double calc_temp(Character op, double v1, double v2) {
        switch (op) {
            case '+':
                return v1 + v2;
            case '-':
                return v1 - v2;
            case '*':
                return v1 * v2;
            case '/':
                return v1 / v2;
        }
        return 0;
    }

    public static double calc(String postfix) throws Exception{
        Stack<Double> vstack = new Stack<>();
        for (String v : postfix.split(" ")) {
            if (v.length() == 1 && !Character.isDigit(v.charAt(0))) {
                if (vstack.size() >= 2) {
                    double temp = calc_temp(v.charAt(0), vstack.pop(), vstack.pop());
                    vstack.push(temp);
                }
                else {
                    throw new Exception("error");
                }
            } else {
                System.out.println(v);
                vstack.push(Double.parseDouble(v));
            }
        }
        return vstack.pop();
    }

    public static void main(String[] args) {

        try {
            String exp = infix2postfix("(2+3)*4+1.3*(2+1)");
            System.out.println(exp);
            System.out.println(calc(exp.trim()));
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            System.out.println(ex.getCause());
            ex.printStackTrace();
        }
        System.out.println();
        System.out.println("Hello World!");
    }
}

  

转载于:https://www.cnblogs.com/kwliu/p/4748409.html

相关文章:

  • Opengl中矩阵和perspective/ortho的相互转换
  • 学习日志---pyhon入门必备
  • 数组作函数参数传递和函数返回值
  • 关于重连测试的一点研究
  • 关于c++字符串的while(*temp++)
  • Java版本的删除指定目录及子目录下名叫“xxx.txt”的所有文件
  • PostgreSQL通过pg_upgrade进行大版本升级
  • MyBatis——动态SQL
  • 南阳483--Nightmare(Bfs)
  • 系统启动流程
  • 8-30 文件查找命令find使用说明和练习
  • hdu1213 并查集
  • 如何禁用/恢复mac的spotlight
  • Jquery 控件
  • MATLAB — axis
  • 自己简单写的 事件订阅机制
  • 【347天】每日项目总结系列085(2018.01.18)
  • CSS盒模型深入
  • laravel 用artisan创建自己的模板
  • NSTimer学习笔记
  • Python socket服务器端、客户端传送信息
  • Python十分钟制作属于你自己的个性logo
  • React-生命周期杂记
  • Selenium实战教程系列(二)---元素定位
  • ubuntu 下nginx安装 并支持https协议
  • 云大使推广中的常见热门问题
  • 在Mac OS X上安装 Ruby运行环境
  • 追踪解析 FutureTask 源码
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 通过调用文摘列表API获取文摘
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (2)STL算法之元素计数
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)创业的注意事项
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Framework .NET Core与 .NET 的区别
  • .net 生成二级域名
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • @angular/cli项目构建--http(2)
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • []常用AT命令解释()
  • [APIO2012] 派遣 dispatching