一个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对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...
随机推荐
- Alpha- 事后诸葛亮(麻瓜制造者)
目录 预期计划 现实进展 团队体会 成员分工及工作量比例 会议总结 预期计划 在Alpha阶段开始之前,我们的预期计划是:从用户登录,发布商品.发布求购信息的基本功能开始做起.用户登录使用输入教务处的 ...
- Python3编写网络爬虫02-基本请求库requests的使用
一.requests 库使用 需要安装 pip install requests import requests #导入requests库 request = requests.get("h ...
- 记录因xen而导致lvs,realserver转发activeconn为0
8.81----vip,keepalived 8.82----realserver 8.83----realserver 8.84----realserver 在8.81上ipvsadm -Ln的时候 ...
- Kubernetes1.91(K8s)安装部署过程(一)--证书安装
安装前忠告:如果你用的是虚拟机,强烈不建议你使用克隆(链接克隆)的方式,至于完整克隆不知道有没有问题,每一台全新安装centos7系统最好. 一.安装前主题环境准备 1.docker安装 建议使用官网 ...
- Docker学习要点记录
Docker的架构和底层技术: 1.docker提供了一个开发,打包,运行app的平台2.把APP和底层infrastructure隔离开来 docker底层技术支持: 1>Namespaces ...
- CentOS配置Hive
hive搭建共分为三种模式:1.embedded,2.local,3.remote server 在这里,主要是配置第3种模式:remote server模式,如下图所示: 我的环境共三台虚拟机:Ho ...
- OpenGL笔记(五) 着色器渲染(以Android为例)
一.Android平台上下文环境的创建及初始化 1. 首先实例化Android上下文环境,即EGL的初始化. bool EGLCore::init(EGLContext sharedContext) ...
- ME_PROCESS_PO_CUST 实现采购订单行项目增强
用户希望创建采购订单时,输入行项目时,能根据采购订单类型,自动带出科目分类类别. 业务顾问看了一下配置,不能实现这个功能,所以用增强实现. 采购订单BADI增强:ME_PROCESS_PO_CUST. ...
- go语言之行--golang核武器goroutine调度原理、channel详解
一.goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式非常的简单,只需使用go关键字 ...
- Exp7 网络欺诈技术防范
Exp7 网络欺诈技术防范 基础问题回答 1.通常在什么场景下容易受到DNS spoof攻击? 在同一局域网下比较容易受到DNS spoof攻击,攻击者可以冒充域名服务器,来发送伪造的数据包,从而修改 ...