一个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!");
    }
}

  

时间: 2024-10-02 13:58:09

一个java实现的简单的4则运算器的相关文章

Java发邮件简单实现

给出一个Java发送邮件的简单实现. 下载 Java代码   1.  接口 public interface MailSendServDu { public void sendEmail(String addressee, String subject, String content); } 2.  实现 import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.Mime

写了一个Java的简单缓存模型

缓存操作接口 /** * 缓存操作接口 * * @author xiudong * * @param <T> */ public interface Cache<T> { /** * 刷新缓存数据 * * @param key 缓存key * @param target 新数据 */ void refresh(String key, T target); /** * 获取缓存 * * @param key 缓存key * @return 缓存数据 */ T getCache(Str

一个java解析xml的简单例子

java解析xml,主要是通过Dom4j实现的,很多场合都会用到此功能,需要解析XML文件. 下面是一个简单的解析XML文件的例子: import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 解析XML文件 * * @author sunlightcs

原来热加载如此简单,手动写一个 Java 热加载吧

1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环境. 2. 热加载与热部署的区别 首先,不管是热加载还是热部署,都可以在不重启服务的情况下编译/部署项目,都是基于 Java 的类加载器实现的. 那么两者到底有什么区别呢? 在部署方式上: 热部署是在服务器运行时重新部署项目. 热加载是在运行时重新加载 class. 在实现原理上: 热部署是直接重新

Java中的简单浮点数类型float和double不能够进行精确运算

在java中,简单的浮点类型float和double是不能够进行运算.我们先看下面的两个程序代码: 代码一: import java.util.Scanner; class Circle { double radius; static final double PI=3.14; public Circle(){this.radius=0;} public Circle(double r){this.radius=r;} public double getArea(){return PI*this

当世界上只剩下一个Java程序员

公元2050年,世界上只剩下了一个Java程序员. 你可能要问了,别的人都去哪儿了?原因很简单, Java没落了. 大约在2030年左右,出现了一个叫做X的语言,它既能做系统级开发(操作系统.数据库.编译器),也能做服务器端的开发,手机端,Web端都不在话下. 更为重要的是,这个新的编程语言和人类的自然语言很接近,无论大人小孩,稍微一学,很快就可以来编程.于是排名前100的语言统统消失了, 程序员们都失业了. Java也不例外,这个昔日的霸主在留下了一堆庞大而复杂的系统以后就不见了. Java程

自己写一个java.lang.reflect.Proxy代理的实现

前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Proxy类出来,功能和java.lang.reflect.Proxy一样,传入接口.代理内容,生成代理. 抛砖引玉吧,个人觉得自己写一些JDK里面的那些类挺好的,写一遍和看一遍真的是两个不同的概念,写一遍既加深了对于这些类的理解.提升了自己的写代码水平,也可以在写完之后对比一下自己的实现有哪些写得不好

一个Java对象到底占多大内存?(转)

最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好:http://yueyemaitian.iteye.com/blog/2033046,里面提供的这个类也非常实用: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

二、第一个JAVA程序——HelloWorld

1.Java程序的运行机制. Java源文件的后缀名为java 形如 *.java,通过编译器编译后生成*.class文件,由计算机来运行class文件执行java程序.但是,此时所指的计算机并不是物理上的计算机而是java的虚拟机,即JVM. Java中所有的程序都是运行在JVM上的,即所有的*.class文件在JVM上运行而对于*.class文件来说只需要符合JVM的规范就可以了,而不需要考虑对硬件或者其他操作系统的兼容性.再由JVM去适应各个操作系统,因此,有了java的一句口号一次编译,