一个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 冲刺】 1/12
1. 任务明细及任务量 Alpha版本任务安排(非固化版本,视情况调整,若有遗漏,及时补充) 职务 姓名 预期负责的模块页面 模块页面/任务明细 难度系数(0~1)(根据UI/功能实现难度划分) 预计 ...
- Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在
Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在 判断用户名是否存在 后端视图代码实现,在users/view.py里编写如下代码 class UsernameCount ...
- console.time方法与console.timeEnd方法
在Node.js中,当需要统计一段代码的执行时间时,可以使用console.time方法与console.timeEnd方法,其中console.time方法用于标记开始时间,console.time ...
- Mysql表创建外键报错
数据库表A: CREATE TABLE task_desc_tab ( id INT(11) PRIMARY KEY NOT NULL COMMENT '自增主键' AUTO_INCREMENT, t ...
- <数据结构与算法分析>读书笔记--利用Java5泛型实现泛型构件
一.简单的泛型类和接口 当指定一个泛型类时,类的声明则包括一个或多个类型参数,这些参数被放入在类名后面的一对尖括号内. 示例一: package cn.generic.example; public ...
- 记一次MyBatis的错误
错误信息:java.lang.StackOverflowError 关于这个错误的深度解析,大家可以参考这篇博文,比较详细:https://blog.csdn.net/zc375039901/arti ...
- MP实战系列(十一)之封装方法详解(续一)
之前写的封装方法详解,比较简要. 今天我主要讲增加和删除及其修改.查的话得单独再详讲. 增删改查,无论是Java或者C#等等,凡是对数据库操作的都离不开这四个. 一.增加方法讲解 MyBatis Pl ...
- gettimeofday()函数来得到时间
gettimeofday()函数的使用方法: 1.简介: 在C语言中可以使用函数gettimeofday()函数来得到时间.它的精度可以达到微妙 2.函数原型: #include<sys/tim ...
- 安装的 Linux 软件包有多少?
导读 你有没有想过你的 Linux 系统上安装了几千个软件包? 是的,我说的是“千”. 即使是相当一般的 Linux 系统也可能安装了上千个软件包. 有很多方法可以获得这些包到底是什么包的详细信息. ...
- Python2.7-tempfile
tempfile 模块,生成临时文件夹或文件,所生成的文件(夹)的名字都是随机的,但可以指定前缀.后缀和路径,中间由6位随机字符组成.应用程序经常要保存一些临时的信息,这些信息不是特别重要,没有必要写 ...