一个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!");
}
}
一个java实现的简单的4则运算器的更多相关文章
- 一个java版本的简单邮箱小爬虫
//趁着有空回头复习了一把正则表达式/* 以下代码以百度某个贴吧的 URL 作为源,实现了读取 EmailAddress 并写入文件保存起来的两个功能,如果要爬取其它信息,可以改写正则实现相应功能 要 ...
- 原来热加载如此简单,手动写一个 Java 热加载吧
1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...
- webmagic的设计机制及原理-如何开发一个Java爬虫
之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方 ...
- 在mac电脑上创建java的一些简单操作
首先你要在电脑上下载一个JDK创造出一个java环境 如下第二个: 然后步奏如下: step1:苹果->系统偏好设置->最下边点MySQL 在弹出页面中 关闭mysql服务(点击stop ...
- 自己写一个java.lang.reflect.Proxy代理的实现
前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Pr ...
- Java WebService 开发简单实例
Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service可以执行从简单的请求到复杂商务处理的任何功能.一旦部署以 ...
- Java 异步处理简单实践
Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...
- Java起源、发展历程、环境变量、第一个Java程序等【1】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: 本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pi ...
- 一个Java对象到底占用多大内存?
最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...
随机推荐
- 以太坊预言机与WEB API(原创,转载请说明原址)
什么是预言机? 从链外获得数据,提供区块链与现实世界事件之间的连接,提供外部信息的平台 预言机自身也是一种智能合约,它允许区块链连接到任何现有的API 是这个预言机去调用各种 WEB API的接口 这 ...
- postMessage 消息传递
点击查看demo 前言 web开发了,除了前台与服务器交换数据,还有可能前台页面间需要进行数据传递,比如窗口间,页面和嵌套的iframe间.这些问题之前都有解决办法,但是现在html5引入的messa ...
- eclipse中文版官方下载
目前eclipse的使用已经越来越广泛,它不仅应用于Java开发中,对于C++开发.php开发的程序员们也是非常喜爱.eclipse中文版下载其实是eclipse官方网站提供的中文包,默认情况下ecl ...
- 容器内部设置JVM的Heap大小
容器内部利用脚本来获取容器的CGroup资源限制,并通过设置JVM的Heap大小. Docker1.7开始将容器cgroup信息挂载到容器中,所以应用可以从 /sys/fs/cgroup/memory ...
- 利用Python爬取豆瓣电影
目标:使用Python爬取豆瓣电影并保存MongoDB数据库中 我们先来看一下通过浏览器的方式来筛选某些特定的电影: 我们把URL来复制出来分析分析: https://movie.douban.com ...
- Centos7 安装Nodejs
使用EPEL安装 EPEL(Extra Packages for Enterprise Linux)企业版Linux的额外软件包,是Fedora小组维护的一个软件仓库项目,为RHEL/CentOS提供 ...
- RPC使用rabbitmq实现
两天时间重写公司架构在本地实现测试学习 双向连接客户端和服务端配置: 连接rabbitmq服务器 定义消息队列 配置发送请求的模板:交换机.消息队列. 配置监听处理:监听的队列.消息转换处理 配置处理 ...
- JAVA框架 Spring 入门
一.阐述: IoC:我们以前写的框架虽然我们已经进行分层,web.业务层.持久层.但是各个层之间的关系.耦合性比较高,那个层调用其他层的时候,需要new对应层的类的对象,这样的话,我们以后做修改的时候 ...
- Python 函数(一)
Python3 函数(基本概念) 1.概念: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段:通过函数,可以对特定功能的代码进行封装,实现代码的复用. 2. 5.参数传递 (1) P ...
- (四)Lua脚本语言入门(数组遍历)
这篇文章就当成铺垫型的文章,写着写着发现有好多想写的,,关于C#与Java,当然作为铺垫肯定与Lua的下部分介绍有关..... 对于"泛型",先看C#中"泛型" ...