一个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对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...
随机推荐
- Beyond Compare使用
1.通过过滤功能设置要比较的文件: 2.all,diff功能适用于文件本身的差异以及目录的差异 其它问题: 1.Beyond Compare比较文件时,相同的文件也显示为红色(有差异) http:// ...
- window与Linux之间的文件传输
使用工具:WinSCP WinSCP可以直接通过SSH链接你的linux服务器:然后进行文件的复制操作:并且可以直接编辑文件. 1.下载WinSCP 2.登录WinSCP,输入你的Linux 的IP地 ...
- Scala学习之路 (三)Scala的基本使用
一.Scala概述 scala是一门多范式编程语言,集成了面向对象编程和函数式编程等多种特性.scala运行在虚拟机上,并兼容现有的Java程序.Scala源代码被编译成java字节码,所以运行在JV ...
- k8s mongodb 集群配置
service.yaml apiVersion: v1 kind: Service metadata: name: mongo labels: name: mongo spec: ports: - p ...
- C#游戏开发中快速的游戏循环
C#游戏开发中快速的游戏循环的实现.参考<精通C#游戏编程>一书. using System; using System.Collections.Generic; using System ...
- 关于javascript中对浮点加,减,乘,除的精度分析
大学专业是计算机童鞋或多或小的知道 计算机是由二进制存储和处理数字的,不能精确到处理浮点数,且javascript也没有这样的方法 所以在浏览器计算的时候也会有误差,比如说 我想用 3.3 / 1.1 ...
- JS时间轴效果(类似于qq空间时间轴效果)
在上一家公司写了一个时间轴效果,今天整理了下,感觉有必要写一篇博客出来 给大家分享分享 当然代码还有很多不足的地方,希望大家多指点指点下,此效果类似于QQ空间或者人人网空间时间轴效果,当时也是为了需求 ...
- python3 面向对象编程--类的封装和继承
#python3import refrom urllib import requestimport os class PosterSpider(object): def __init__(se ...
- 20155209林虹宇 Exp6 信息搜集与漏洞扫描
Exp6 信息搜集与漏洞扫描 1.信息收集 1.1通过DNS和IP挖掘目标网站的信息 whois查询 进行whois查询时去掉www等前缀,因为注册域名时通常会注册一个上层域名,子域名由自身的域名服务 ...
- WPF编程,通过DoubleAnimation控制图片的透明度,将重叠的图片依次显示。
原文:WPF编程,通过DoubleAnimation控制图片的透明度,将重叠的图片依次显示. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307 ...